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