2014-04-07 50 views
1

所以我正在阅读Jon Skeet关于C#中参数传递的文章,他做了下面的例子来解释引用类型是如何工作的,但是我无法将它包裹起来。需要关于参考类型的一些说明

StringBuilder first = new StringBuilder(); 
first.Append("hello"); 
StringBuilder second = first; 
first.Append(" world"); 
first = new StringBuilder("goodbye"); 
Console.WriteLine(first); // Prints goodbye 
Console.WriteLine(second); // Still prints hello world 

当我们分配second变量的值,我们只是值设置为StringBuilder对象的引用?

而且作为奖金的问题,如果我们要改变second变量到别的参考(将其设置为例如空值),将在参考第一StringBuilder对象则是无法弥补的?或者有没有办法检索某个类型的所有创建的对象?

+0

你的奖金问题不是很清楚。你是说如果你愿意的话:'StringBuilder second = first; second = null;'例如? –

+0

正是这正是我的意思,我会编辑澄清。 –

回答

3

当我们赋予第二个变量的值,我们只是 设置该值到StringBuilder对象的引用?

是。我们只需将指针复制到包含“hello world”的内存中。

,如果我们将在第二个变量的引用更改为其他 ,该会参考第一StringBuilder对象则是无可挽回的 ?或者有没有办法检索到某个类型的所有创建的对象 ?

是的,由它分配的内存将成为垃圾收集的候选对象,因为没有任何指针引用它。

+0

所以如果我正确地理解了你的话,那么只要不再有指向它的指针,GC就会处理这个对象?这或多或少是即时的吗? –

+1

@OverlyExcessive - 不,它*不*即时。它会在“未来某个时候”发生,也许内存压力变高(系统需要额外的内存)或有空余时间清理。 –

+0

@OverlyExcessive:如果它最终进入第二代,它甚至可能根本不会发生,所以你会得到一个内存泄漏。[垃圾回收的基础](http://msdn.microsoft.com/en-us/library/vstudio/ee787088%28v=vs.100%29.aspx#generation) – Tigran

0

线

first = new StringBuilder("goodbye"); 

减免这两个对象之间的连接。

所以首先有goodbye和第二有hello world

1
StringBuilder second = first; 

second变量现在保持在存储器中作为first变量的参考同一个地方。

然而,这条线:

first = new StringBuilder("goodbye"); 

现在说first得到一个全新的基准,以一个新的对象,从而打破firstsecond之间的连接。