我有一个有一个属性的类
public class Test
{
public string Name { get; set; }
}
private void TestReference()
{
Test tst1 = new Test();
tst1.Name = "ASP.NET";
Test tst2 = tst1;
tst1.Name = "JAVA";
string name = tst2.Name; // Shows "JAVA" because of reference sharing
tst1 = null;
bool isNullObj = tst2 == null; // isNullObj is false
}
在上面的示例中,当我设置tst.Name = "JAVA"
时,由于参考共享,此更改也反映在tst2.Name
中,我理解这一点,但是当我设置tst = null;
tst2
时仍然存在。
我的问题是,如果是分享参考!为什么tst2
还活着?
答案 0 :(得分:7)
tst1
和tst2
是保存对内存中对象的引用的变量。如果两者都指向同一个对象,则可以通过任何引用更改对象。
如果您将某个变量的引用重新签名,则另一个变量仍会保留其引用。这就是将tst1
设置为null
(或任何其他值)的原因不会影响tst2
。
以下是你的记忆:
答案 1 :(得分:2)
当您将引用视为指针时,这(奇怪的是)更有意义。
当我写:
tst1.Name = "JAVA";
我正在浏览指针并修改对象本身。但是,当我写:
tst1 = null;
我只是将变量(指针类型)设置为null。它指向的对象不受影响。因此,
tst2 == null
总是会返回false。
答案 2 :(得分:1)
考虑这种情况,没有Reference Types:
int a = 1; // a = 1
int b = a; // a = 1, b = 1
a = 2; // a = 2, b = 1
// a == b -> false
这是与问题中显示的代码一起发生的相同的事情。对于参考类型,只有参考值(或“对象的引用”)存储在变量中。但是,变量本身是分开的,并且重新分配给而不是影响任何其他变量。
(解释了“共享”行为,因为在问题中,多个变量可以包含相同的引用值,因此引用相同的对象。)< / p>