繁体   English   中英

参考类型作为值和参考参数

[英]Reference types as value and reference parameters

因此,在遍历Illustrated C#2012的过程中,除了本章的这一部分,我基本上得到了所有内容,以下是源代码:

class MyClass
{
    public int Val = 20;
}

class Program
{
    static void RefAsParameter(MyClass f1)
    {
        f1.Val = 50;
        Console.WriteLine( "After member assignment: {0}", f1.Val );
        f1 = new MyClass();
        Console.WriteLine( "After new object creation: {0}", f1.Val );
    }

    static void Main()
    {
        MyClass a1 = new MyClass();
        Console.WriteLine( "Before method call: {0}", a1.Val );
        RefAsParameter( a1 );
        Console.WriteLine( "After method call: {0}", a1.Val );
    }
}

此代码产生以下输出:

Before method call: 20
After member assignment: 50
After new object creation: 20
After method call: 50

所以...我基本上了解到了最后一个Console.WriteLine()。 为什么是50“方法调用后”。 由于它创建了一个新的“ MyClass()”,所以它应该不是20吗? 显然,我错过了主要是显而易见的东西。 是因为f1.Val更改了Myclass Public的价值为“好”还是什么?

对此有些困惑。 谢谢。 我一般都理解“引用”这一点,只是有点难过。

线

f1 = new MyClass();

将变量f1重新分配为指向新的MyClass 它不会更改a1变量。

如果将方法更改为此:

static void RefAsParameter( ref MyClass f1 )

然后,它改变a1变量,你会得到:

After method call: 20

看..我的绘画技巧真棒:

在此处输入图片说明

单击此处查看完整图像

在方法中使用f1 ,它是指向内存中相同对象新引用 当您使用f1 = new MyClass();重新分配引用时f1 = new MyClass(); ,您实际上是在说“好的,此引用现在指向一个新实例”。 这使a1保持不变..因此,当函数展开并单击Console.WriteLine ,您的a1引用仍然引用内存的旧区域。.现在,该属性的属性设置为50。

要获得预期的行为,请将对象作为ref参数传递:

static void RefAsParameter(ref MyClass f1)

引用对象时,并不表示它正在复制自身。 这意味着我们指向具有两个不同名称的同一对象。 在这里, a1f1都引用同一个对象,这就是为什么如果我们使用f1更改值,那么a1的值也将更改。

稍后,您将创建另一个实例,并将引用分配给f1 因此,现在f1将不再有权访问先前的对象,并且现在a1f1将不再引用同一对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM