.net如何管理内存参考共享?

时间:2014-05-23 18:20:18

标签: c# .net reference

我有一个有一个属性的类

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还活着?

3 个答案:

答案 0 :(得分:7)

tst1tst2是保存对内存中对象的引用的变量。如果两者都指向同一个对象,则可以通过任何引用更改对象。

如果您将某个变量的引用重新签名,则另一个变量仍会保留其引用。这就是将tst1设置为null(或任何其他值)的原因不会影响tst2

以下是你的记忆:

enter image description here

答案 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>