创建没有引用的对象

时间:2010-02-18 05:32:56

标签: c# .net

我脑子里只有几个问题......

  1. 创建一个没有引用的对象是一个好习惯,如下所示。如果是这样,为什么?

    LoadIt(new myClass());其中LoadIt是某种方法

  2. 上面创建的对象会发生什么。这会被垃圾收集。如果是这样的话?即,其范围与其他对象相同

  3. 有没有机会再次引用同一个对象?

6 个答案:

答案 0 :(得分:3)

范围由Method(此处为LoadIt)...

决定

如果Load it方法将myClass参数存储在全局变量中,那么在全局变量超出范围之前,Object将保留在内存中...即。它不会被垃圾收集,因为全局变量仍然引用它......

对象通常存储在堆中,并且可以通过堆栈中的许多变量引用...在这里,您不希望在方法的堆栈中保存引用...但它在LoadIt方法的堆栈中引用通过它的参数...因此,在Load it方法的参数超出范围之前,对象不会被垃圾收集......同时,LoadIt方法可以尝试在全局变量中再次引用它或将其作为一个传递给它另一个方法的参数......总的来说,只有当堆栈(或其他对象)中对象的所有引用都超出范围时,该对象才被垃圾收集......

获取对该对象的引用,完全取决于它使用此对象对Load方法执行的操作...如果该方法除了使用参数变量引用它之外什么也不做,那么你就无法将其恢复...但是如果该方法将引用复制到其他可公开的变量,那么您可以使用该变量并获取引用。

答案 1 :(得分:2)

2)默认情况下,无法知道此(或任何)对象何时被垃圾收集,因为它是一个非确定性过程。

3)绝对。这一切都取决于LoadIt方法中发生的事情。

答案 2 :(得分:2)

如果LoadIt定义为

public MyClass LoadIt(MyClass myClass)
{
    ... do somthing
    return myClass;
}

您可以再次参考。

答案 3 :(得分:1)

  1. 除非(您在#3中对此进行了解释),否则您需要稍后引用相同的MyClass实例。

  2. 它与您完成var a = new MyClass()的范围相同。它将像任何其他对象一样被GCed;那时没有更多的引用和GC运行。

  3. 没有。除非LoadIt当然要返回该对象。

答案 4 :(得分:1)

为了确保您获得#2的完整答案,请了解对该对象的引用。您已创建它并传递了对该方法的引用,该方法在该方法中称为参数。这是对象的有效引用,只要该方法具有到该参数的未完成的代码路径,它就不会被收集,因为引用被认为是可到达的(它可以通过一些对象图表来跟踪到5个GC根中的一个,在这种情况下,可能是堆栈或CPU寄存器。)

答案 5 :(得分:0)

1)它取决于你想要做什么,但是当你传递对象的新实例时,最好在需要它的地方创建新实例。但我相信你已经意识到了这一点。

2)任何托管代码都是垃圾回收所以是的,它将被垃圾收集,何时由CLR决定。

3)是的,你可以在LoadIt方法中引用它,但不能在LoadIt之外引用它。