引用类型复制和垃圾回收器

本文关键字:复制 引用类型 | 更新日期: 2024-09-21 15:11:35

我有以下功能:

HashSet<string> Func()
{
     HashSet<string> output = new HashSet<string>();
     output.Add("string_1");
     output.Add("string_2");
     return output;
}

然后我调用这个方法并将其复制到一个引用类型:

HashSet<string> bindingObjct = Func();

这是从函数"output"的返回和调用"bindingObjct"时的绑定变量的引用复制,因此两者都引用相同的对象。

我的问题:当垃圾收集器在"output"(函数内部的局部变量)上进行时,这会影响"bindingObject"吗?甚至在最近使用"bindingObject"时?

引用类型复制和垃圾回收器

垃圾回收是对对象执行的,而不是对变量执行的。output不是垃圾回收;您创建的HashSet(它有一个临时存储在output中的引用)将在某个时刻被垃圾收集,因为没有活动变量存储对它的引用。

简而言之,你所指的变量不会以任何方式改变。HashSet在其使用寿命内保持有效。一旦它符合垃圾收集条件,您将无法再访问它(根据定义;如果您能够访问它,它就没有资格进行垃圾收集)。

GC将只收集不再在任何地方引用的对象——默认情况下这是相当悲观的。如果对同一个对象有多个引用,.NET GC将处理此问题,但跟踪对象和图的寿命可能会成为性能的一个因素。

因此,根据我的理解,你的问题的答案是"否",GC不会对其他地方引用的对象采取行动