所以我正在阅读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 :(得分:3)
当我们分配第二个变量的值时,我们就是这样 将该值设置为StringBuilder对象的引用?
是。我们只是将指针复制到包含" hello world"的内存中。
如果我们将第二个变量的引用更改为某个东西 否则,将引用第一个StringBuilder对象 不可挽回的?或者有没有办法检索所有创建的对象 某种类型?
是的,由它分配的内存将成为垃圾收集的候选者,因为没有任何指针引用它。
答案 1 :(得分:1)
StringBuilder second = first;
表示second
变量现在保存对内存中与first
变量相同位置的引用。
然而,这一行:
first = new StringBuilder("goodbye");
现在说first
获得了对新对象的全新引用,从而打破了first
和second
之间的联系。
答案 2 :(得分:0)
行
first = new StringBuilder("goodbye");
打破了这两个对象之间的联系。
首先是goodbye
,第二个是hello world