【问题标题】:When is my destructor called in this circumstance? (C#)在这种情况下什么时候调用我的析构函数? (C#)
【发布时间】:2010-11-18 13:55:11
【问题描述】:

我想知道在这种情况下什么时候调用析构函数,如果是,它会在主 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() 处被中断,或者如果析构函数调用等待线程空闲。

感谢您的信息。

【问题讨论】:

    标签: c# .net destructor


    【解决方案1】:

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

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

    Implementing a Dispose Method

    【讨论】:

    • 第一句话也许可以做一些澄清。当垃圾收集器执行收集时,它会将带有终结器的对象添加到终结队列中。因此,可以在对象最初被垃圾回收后的任何时候调用终结器,而不一定是立即调用。
    • (到通道 Fowler)- 实施 Dispose 的第一条规则:“不要实施 dispose”。 ;-) 请务必阅读此答案中的链接。选择实现 dispose 并非易事。垃圾回收意味着在大多数情况下我们不需要担心对象何时被销毁。
    • 好吧,这条规则(当你不需要释放资源时不要实现 dispose)有时会为了代码简单而忽略。你有没有看到开发人员使用 Dispose() 只是为了简单地编写一些可以使用 {new myobject()} 语句的代码。例如:social.msdn.microsoft.com/Forums/en-US/winforms/thread/…。因此,这段代码对资源没有任何作用,它只是一种将语言功能用于不同目的的技巧。
    • 这是另一条规则——“对最终确定方法说不!” :) developer.com/net/csharp/article.php/2233111 。然而,关于什么更好的讨论可以在另一个 SO 主题 stackoverflow.com/questions/732864/finalize-vs-dispose 中找到
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2022-10-15
            • 1970-01-01
            • 2011-03-11
            • 1970-01-01
            • 2015-03-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多