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

时间:2013-12-14 09:19:56

标签: c# garbage-collection reference-type

我有以下功能:

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”?

2 个答案:

答案 0 :(得分:4)

垃圾收集是在对象上执行的,而不是在变量上执行的。 output不是垃圾收集;您创建的HashSet(临时存储在output中的参考)将在没有实时变量存储对它的引用之后的某个时刻进行垃圾收集。

简而言之,您所指的变量不会以任何方式更改。 HashSet在其生命周期内仍然有效。一旦它有资格进行垃圾收集,您将无法再访问它(根据定义;如果您能够访问它,它就没有资格进行垃圾收集)。

答案 1 :(得分:1)

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

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