在这种情况下,我的析构函数何时被调用? (C#)

时间:2009-08-11 10:52:00

标签: c# .net destructor

我想知道在这些情况下何时调用析构函数,如果是,它将在主UI线程上调用?

假设我有以下代码,何时调用析构函数,是否会等到我完成所有函数调用?

private void Foo()
  {
  MyObject myObj = new MyObject();
  DoSomeFunThingsWithMyObject(myObj);

  myObj = new MyObject(); //is the destructor for the first instance called now?
  DoLongOminousFunctionality(myObj);  
  }
  //Or will it be called after the DoLongOminousFunctionality?

如果线程在myObj = new MyObject()中断,或者Destructor调用等待线程空闲,那么这只是让我感兴趣的东西。

感谢您提供的信息。

5 个答案:

答案 0 :(得分:17)

当垃圾收集器决定必须清理一些旧对象时,将调用析构函数。您不能依赖.NET中的析构函数执行时间

如果你想在不需要时清理一些资源(尤其是当你有任何非托管资源,如TCP连接,SQL连接等)时,你应该使用Dispose()。

请参阅Implementing a Dispose Method

答案 1 :(得分:3)

如果管理对象的生命周期至关重要,则从IDisposible继承,您可以使用using keyword

答案 2 :(得分:2)

在您的实例可用于垃圾回收之后的某个时间点调用它们也被命名的析构函数或终结符。它不会像在C ++中那样在确定性的时间点发生。

答案 3 :(得分:2)

析构函数(或者终结者有些人更喜欢称它们)完全在一个单独的线程上运行。它们在没有特定的时间运行。它们不能保证在你的应用程序生命结束之前完全运行,即便如此,它们也可能不会被调用。

答案 4 :(得分:1)

一旦垃圾收集器确定您的对象不再使用,将调用析构函数(终结器)。终结器在终结器线程上运行,同时到主程序!

通过正确的优化(JIT编译器可以轻松地消除局部变量),这可能早在内部 第一个 DoSomeFunThingsWithMyObject调用(一旦该方法没有'不再需要它的参数),或者在以后的任何时候。也许它甚至在您的程序关闭之前都没有调用(在极少数情况下,终结器从不调用)。