[英]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)
引用对象时,并不表示它正在复制自身。 这意味着我们指向具有两个不同名称的同一对象。 在这里, a1
和f1
都引用同一个对象,这就是为什么如果我们使用f1
更改值,那么a1
的值也将更改。
稍后,您将创建另一个实例,并将引用分配给f1
。 因此,现在f1
将不再有权访问先前的对象,并且现在a1
和f1
将不再引用同一对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.