引用类型复制和垃圾回收器
本文关键字:复制 引用类型 | 更新日期: 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不会对其他地方引用的对象采取行动