垃圾收集器和方法内创建的对象/变量

时间:2012-08-30 13:01:14

标签: .net garbage-collection

当我在方法中创建一个对象/变量时,在方法调用之后,所有对象都将被设置为由GC收集,并且所有“原始”变量(int,string,decimal ...)都被销毁,对?

所以,如果是的话:

public void MyMethod()
{
    // Imagine an class that connects with ftp server
    MyObject o = new MyObject();
    o.Connect(); 
}

如果我在o.Connect()行中有错误,我有一个try`catch only to log the error, MyObject o`将由GC收集?

3 个答案:

答案 0 :(得分:1)

垃圾收集器进行“收集”时没有固定的时间。有三个“世代”的物体和物体如果能够在收藏中存活下来,就会被提升一代。所以,是的,如果你在try / catch块中“捕获”错误,那么垃圾收集器将释放你的对象占用的内存。

您可以找到有关垃圾收集here

的更多信息

答案 1 :(得分:0)

GC将在范围内的任何对象无法再访问对象后的某个时间收集对象。它可能无法及时收集,因此如果您希望及时结束连接,则应使用IDisposable模式和using块。

(注意:CLR GC的行为并不简单,并且几乎不能保证何时收集对象。一般的经验法则是依靠GC来回收内存,但要注意其他资源,例如连接,明确地说。)

答案 2 :(得分:0)

让我们逐行查看代码

public void MyMethod()
{
    MyObject o = new MyObject(); // local object
    o.Connect();
} // object o now goes out of scope and becomes subject for GC

但我猜你的问题的性质是在,如果你仍然能够记录错误。答案是。有两种可能的情况:

  • o.Connect同步,这意味着在执行所有逻辑之前,您不会点击最后一行}
  • o.Connect异步,让我称之为o.ConnectAsync,这意味着您将直接点击最后},无需等待连接这是魔法。这怎么可能?这是可能的,因为o.ConnectAsync(可能)将在一个单独的线程中执行。 o.ConnectAsync的工作线程将保留对o对象的引用,因此它不会成为GC的主题。只有在异步方法完成后,o才可用于GC。