我想知道何时以及为什么引用在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不会导致a要null呢?
Jon*_*eet 12
您需要区分变量,引用和对象.
这一行:
b = a;
Run Code Online (Sandbox Code Playgroud)
设置的值b,它的值a.该值是参考.它是对象的引用.此时,通过其中任何一个对对象进行更改a或者b只更改同一个对象 - 这些更改将通过其中一个a或b两个可见,因为它们仍然具有对同一对象的引用.
它们就像两张纸,上面写着相同的住宅地址 - 两个变量彼此之间没有任何关系,它们碰巧由于前一行而具有相同的值.
所以,当我们更改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仍保持其参考.
这是一张描绘这个的图片:
您需要分别考虑引用和对象.有一个对象,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)的用途.
| 归档时间: |
|
| 查看次数: |
2201 次 |
| 最近记录: |