6

我想知道在这些情况下何时调用析构函数,如果是,它会在主 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() 处被中断,或者如果析构函数调用等待线程空闲,这只是我感兴趣的事情。

谢谢你提供的详情。

4

5 回答 5

17

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

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

请参阅实现 Dispose 方法

于 2009-08-11T10:55:35.597 回答
3

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

于 2009-08-11T10:58:41.567 回答
2

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

于 2009-08-11T10:55:04.583 回答
2

析构函数(或终结器,有些人更喜欢称它们为终结器)完全在单独的线程上运行。它们在没有特定时间运行。在您的应用程序生命周期结束之前,它们根本不能保证运行,即使那样它们也可能不会被调用。

于 2009-08-11T10:55:11.103 回答
1

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

通过正确的优化(JIT 编译器可以很容易地消除局部变量),这可能早一个DoSomeFunThingsWithMyObject 调用中(一旦该方法不再需要其参数),或者在以后的任何时间。也许在你的程序关闭之前它甚至不会被调用(在极少数情况下,终结器永远不会被调用)。

于 2009-08-11T14:14:44.977 回答