【发布时间】:2009-05-29 17:22:47
【问题描述】:
在 .NET 中,是否有一种简单的方法可以在类超出范围时得到通知?
【问题讨论】:
在 .NET 中,是否有一种简单的方法可以在类超出范围时得到通知?
【问题讨论】:
没有。
如果您需要清理内存以外的资源,请实现 IDisposable 并使用 using 块创建对象。如果你需要清理内存,你真的可以把它留给垃圾收集器。
【讨论】:
是的,有一些语言。当 IDisposable 实现者的非堆分配超出范围时,C++/CLI 将为它们发出 Dipose 调用(有效地为它们提供与普通 C++ 中的堆栈分配资源相同的语义)。此外,~Classname 的 C++/CLI 析构函数语法成为 Dispose 的实现(并使类实现 IDisposable)。
我希望随着时间的推移,其他具有传统确定性破坏的语言也会采用这种策略。正如其他人所提到的,您可以在 C# 中使用“using”来模拟它,但并不完全相同。
【讨论】:
如果它实现了 IDisposable 并且您正在使用 using 块,当然可以。
【讨论】:
不,没有。
【讨论】:
不,任何 .NET 语言都没有确定性的终结。垃圾收集器负责最终确定在应用程序中没有根的对象。
【讨论】:
如果它实现了 IDisposable,你的 Dispose() 方法会发现:
using (var c = new YourClassImplementsIDisposable() )
{
// Stuff happens
}
// c.Dispose has been called
否则不,因为你的对象只是在 GC 之前“闲逛”
【讨论】:
您可以使用终结器。它会在垃圾收集后被调用,但不会在离开作用域后立即调用。
http://www.switchonthecode.com/tutorials/csharp-tutorial-object-finalizers
【讨论】: