【问题标题】:Passing a reference by reference通过引用传递引用
【发布时间】:2013-09-10 00:59:22
【问题描述】:

按引用传递引用对象有什么用。常规用法如下:

public static void main()
{
    Student st = new Student();
    st.FirstName = "Marc";
    PutLastName(st);
    Console.WriteLLine(st.FirstName + " " + st.LastName);
}

public static PutLastName(Student student)
{
    student.LastName = "Anthony";
}

为什么有人会写以下内容,它做同样的事情并打印:“Marc Anthony”:

public static void main()
{
    Student st = new Student();
    st.FirstName = "Marc";
    PutLastName(ref st);
    Console.WriteLLine(st.FirstName + " " + st.LastName);
}

public static PutLastName(ref Student student)
{
    student.LastName = "Anthony";
}

【问题讨论】:

标签: c# parameter-passing pass-by-reference


【解决方案1】:

它不会做同样的事情......在引擎盖下。

在功能上,它的工作原理是一样的,是的。虽然在引擎盖下.. 使用ref 时正在传递引用本身。如果没有ref,则会复制引用值。

将引用视为内存指针。 student 的值为 1134.. 一个内存地址。当你不使用ref 时,1134 被应用到一个新的引用.. 指向同一个内存地址。

当您意识到上述情况时,使用ref 可能会产生危险的后果。例如,考虑一下:

public static void PutLastName(Student student)
{
    student = new Student();
    student.LastName = "Whitehead";
}

// .. calling code ..
Student st = new Student();
st.FirstName = "Marc";
st.LastName = "Anthony";
PutLastName(st);
Console.WriteLLine(st.FirstName + " " + st.LastName); // "Marc Anthony"

而,使用ref

public static void PutLastName(ref Student student)
{
    student = new Student();
    student.FirstName = "Simon";
    student.LastName = "Whitehead";
}

// .. calling code ..
Student st = new Student();
st.FirstName = "Marc";
st.LastName = "Anthony";
PutLastName(ref st);
Console.WriteLLine(st.FirstName + " " + st.LastName); // "Simon Whitehead"

使用ref 物理更改了引用。没有它..你只是告诉一个不同的引用指向其他地方(一旦函数退出,这就是无效的)。因此,当使用ref 时,您将赋予被调用者以物理方式更改引用本身的能力。不仅仅是它指向的内存。

【讨论】:

  • 我完全理解了其中的区别,当您说使用 ref 可能很危险时,您说的很对。谢谢,
【解决方案2】:

在第二个版本中,ref 意味着 PutLastName 可以更改 st。

【讨论】:

    【解决方案3】:

    通过引用传递引用不仅允许您编辑引用的数据,还允许您更改它所引用的对象。

    区别在于这些用途:

    // from the Main's point of view, this function does absolutely nothing
    public static PutLastName(Student student)
    {
        student = new Student();
    }
    
    // This would clear Main's student.
    public static PutLastName(ref Student student)
    {
        student = new Student();
    }
    

    http://msdn.microsoft.com/en-us/library/14akc2c7.aspx

    【讨论】:

      【解决方案4】:

      基本上,通过引用传递(refout)不管类型(引用类型或其他类型)都做同样的事情——它允许对函数中参数的赋值与分配给调用范围内的原始传递变量。如果不通过引用传递,则永远不会发生这种情况。

      【讨论】:

        猜你喜欢
        • 2015-01-12
        • 1970-01-01
        • 1970-01-01
        • 2011-06-28
        • 2015-07-22
        • 2015-05-02
        • 2012-03-13
        • 2015-06-04
        • 2017-07-29
        相关资源
        最近更新 更多