1

当我在方法中创建对象/变量时,在方法调用之后,所有对象都将被设置为由 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 收集?

4

3 回答 3

1

垃圾收集器进行“收集”的时间没有固定。存在三个“代”对象,如果对象在收集中存活,则它们会被提升一代。所以是的,如果您在 try/catch 块中“捕获”错误,那么垃圾收集器将释放对象占用的内存。

您可以在此处了解有关垃圾收集的更多信息

于 2012-08-30T13:05:03.827 回答
0

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

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

于 2012-08-30T13:04:05.620 回答
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。
于 2012-08-30T13:25:13.027 回答