我有以下功能:
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”时的绑定变量的引用复制,因此两者都指向相同的对象。
我的问题: 当垃圾收集器在“输出”(函数内部的局部变量)上进行时,这会影响“bindingObject”吗?即使最近使用“bindingObject”?
答案 0 :(得分:4)
垃圾收集是在对象上执行的,而不是在变量上执行的。 output
不是垃圾收集;您创建的HashSet
(临时存储在output
中的参考)将在没有实时变量存储对它的引用之后的某个时刻进行垃圾收集。
简而言之,您所指的变量不会以任何方式更改。 HashSet
在其生命周期内仍然有效。一旦它有资格进行垃圾收集,您将无法再访问它(根据定义;如果您能够访问它,它就没有资格进行垃圾收集)。
答案 1 :(得分:1)
GC只会收集不再在任何地方引用的对象 - 默认情况下它相当悲观。如果您对同一个对象有多个引用,那么.NET GC将处理这个问题,但跟踪对象和图形的生命周期可能会成为性能的一个因素。
因此,根据我的理解,您的问题的答案是“否”,GC不会对其他地方引用的对象采取行动