【问题标题】:.NET instant out of scope notification?.NET 即时超出范围通知?
【发布时间】:2009-05-29 17:22:47
【问题描述】:

在 .NET 中,是否有一种简单的方法可以在类超出范围时得到通知?

【问题讨论】:

    标签: .net scope


    【解决方案1】:

    没有。

    如果您需要清理内存以外的资源,请实现 IDisposable 并使用 using 块创建对象。如果你需要清理内存,你真的可以把它留给垃圾收集器。

    【讨论】:

      【解决方案2】:

      是的,有一些语言。当 IDisposable 实现者的非堆分配超出范围时,C++/CLI 将为它们发出 Dipose 调用(有效地为它们提供与普通 C++ 中的堆栈分配资源相同的语义)。此外,~Classname 的 C++/CLI 析构函数语法成为 Dispose 的实现(并使类实现 IDisposable)。

      我希望随着时间的推移,其他具有传统确定性破坏的语言也会采用这种策略。正如其他人所提到的,您可以在 C# 中使用“using”来模拟它,但并不完全相同。

      【讨论】:

        【解决方案3】:

        如果它实现了 IDisposable 并且您正在使用 using 块,当然可以。

        【讨论】:

          【解决方案4】:

          不,没有。

          【讨论】:

            【解决方案5】:

            不,任何 .NET 语言都没有确定性的终结。垃圾收集器负责最终确定在应用程序中没有根的对象。

            【讨论】:

            • 他并没有询问最终确定,而是询问是否收到通知。至于它在任何 .NET 语言中都不可用,如果您使用 C++/CLI(最初出现在 VS2005 中的托管 C++ 的继承者)编程,您可以声明对对象的引用,就好像它是一个自动变量一样。如果该对象的类实现了 IDisposable,它将在超出范围时收到通知。这是 C# 恕我直言的遗憾。
            【解决方案6】:

            如果它实现了 IDisposable,你的 Dispose() 方法会发现:

            using (var c = new YourClassImplementsIDisposable() )
            {
                // Stuff happens
            }
            // c.Dispose has been called
            

            否则不,因为你的对象只是在 GC 之前“闲逛”

            【讨论】:

              【解决方案7】:

              您可以使用终结器。它会在垃圾收集后被调用,但不会在离开作用域后立即调用。

              http://www.switchonthecode.com/tutorials/csharp-tutorial-object-finalizers

              【讨论】:

                猜你喜欢
                • 2019-10-27
                • 2012-05-04
                • 1970-01-01
                • 2023-03-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-06-18
                • 1970-01-01
                相关资源
                最近更新 更多