打破C#引用

Joe*_*icz 4 c# reference

我想知道何时以及为什么引用在C#中被破坏了?

以下代码示例突出显示了此:

StringBuilder a = null, b = null;
a = new StringBuilder("a");
b = a;
b.Append("b");
b = null;
Console.WriteLine(a != null? a.ToString() : "null");
Console.WriteLine(b != null ? b.ToString() : "null");

//Output: 
    ab
    null
Run Code Online (Sandbox Code Playgroud)

为什么,在这个例子中,是b的参考a不会导致anull呢?

Jon*_*eet 12

您需要区分变量,引用对象.

这一行:

b = a;
Run Code Online (Sandbox Code Playgroud)

设置的值b,它的值a.该值是参考.它是对象的引用.此时,通过其中任何一个对对象进行更改a或者b只更改同一个对象 - 这些更改将通过其中一个ab两个可见,因为它们仍然具有对同一对象的引用.

它们就像两张纸,上面写着相同的住宅地址 - 两个变量彼此之间没有任何关系,它们碰巧由于前一行而具有相同的值.

所以,当我们更改b此行的值时:

b = null;
Run Code Online (Sandbox Code Playgroud)

只会改变.的价值b.它将值设置b为空引用.这使得不改变的任一值a 所述StringBuilder其的旧值对象b引用.

我有一篇文章详细介绍了这一点,你会发现它很有用.


Mic*_*eyn 11

变量b没有对变量的引用a,它具有对引用的StringBuilder对象的引用a.这就是b=a它所做的,它分配给b对象引用的引用a.只要是这种情况,b当通过对象使用时,对象的任何更改都是可见的a.

b被分配null,它不再有任何对象的引用,但a仍保持其参考.

这是一张描绘这个的图片:

参考


Mar*_*ell 7

您需要分别考虑引用对象.有一个对象,StringBuilder.引用本质上是对象的内存位置(给出或采取一些名义上的抽象),其值为某个大整数.你有两个引用变量.

StringBuilder a = null, b = null; // both variables empty
a = new StringBuilder("a"); // a ref to the obj, b empty
b = a; // copy value (ref) of a to b: a and b both ref to obj
b.Append("b"); // no change to either VARIABLE; the OBJECT has changed state
b = null; // clear the variable b; a still points to the obj
Run Code Online (Sandbox Code Playgroud)

另请注意,即使我们添加

a = null; // both variables empty
Run Code Online (Sandbox Code Playgroud)

我们还有2个空变量和一个对象; 对象不会神奇地消失 - 这就是垃圾收集(GC)的用途.

  • @IAbstract我还原你的编辑; 我的代码是正确的; 有问题的行*不会改变`b`*. (2认同)

Joe*_*orn 6

b没有对a的引用.没有"a"可以参考.你在内存中有一个对象(stringbuilder)和两个引用它的不同变量.该行在b = aa 中创建引用的副本并将其分配给b.