需要对参考类型进行一些澄清

时间:2014-04-07 09:05:04

标签: c# oop reference

所以我正在阅读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对象无法挽回?或者有没有办法检索某种类型的所有创建对象?

3 个答案:

答案 0 :(得分:3)

  

当我们分配第二个变量的值时,我们就是这样   将该值设置为StringBuilder对象的引用?

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

  

如果我们将第二个变量的引用更改为某个东西   否则,将引用第一个StringBuilder对象   不可挽回的?或者有没有办法检索所有创建的对象   某种类型?

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

答案 1 :(得分:1)

StringBuilder second = first;

表示second变量现在保存对内存中与first变量相同位置的引用。

然而,这一行:

first = new StringBuilder("goodbye");

现在说first获得了对新对象的全新引用,从而打破了firstsecond之间的联系。

答案 2 :(得分:0)

first = new StringBuilder("goodbye");

打破了这两个对象之间的联系。

首先是goodbye,第二个是hello world