C#类:记录/管家,我应该使用析构函数吗?

时间:2011-07-28 16:44:58

标签: c# dispose destructor

我有一个c#类。每当这个课程不再使用时,我想做一些事情。例如,记录当前状态等等。

我想确保每次不再使用该类时都会运行此方法。 我不想只使用一个简单的方法,因为我不能确定每个用户都在调用它。

我没有资源(比如文件句柄)来清理。

使用析构函数的最佳方法是什么?

“未使用”是指(例如):

  • 用户在表单中使用我的类,表单已关闭
  • 该类在应用程序中使用,此应用程序已关闭

3 个答案:

答案 0 :(得分:2)

不,这不是最好的方式,析构函数代价高昂。

最好的方法是添加Close()或Dispose()(IDiposable接口)方法。

但是你需要非常仔细地定义“不再使用”的含义,如果你想要额外的麻烦来管理和跟踪它。

您可以使用析构函数来自动化它,但最好是使用该条件(仅限Debug配置)。还要考虑destuctor实现“非确定性”终结。

答案 1 :(得分:2)

这取决于。 C#.NET利用垃圾收集器隐式清理对象。通常,您无法控制对象的清理 - 垃圾收集器就是这样做的。如果您愿意,可以在类中实现析构函数,但是可能会受到性能影响。 MSDN会在destructors上说明这一点:

  

通常,C#不需要所需的内存管理   当您使用不以运行时为目标的语言进行开发时   垃圾收集。这是因为.NET Framework垃圾   collector隐式管理内存的分配和释放   你的对象。但是,当您的应用程序封装非托管时   您应该使用Windows,文件和网络连接等资源   使用析构函数来释放这些资源。当对象符合条件时   对于销毁,垃圾收集器运行的Finalize方法   对象

最后是表现:

  

当一个类包含析构函数时,会在该类中创建一个条目   完成队列。当析构函数被调用时,垃圾收集器   被调用来处理队列。如果析构函数为空,这只是   导致不必要的性能损失。

除了析构函数之外,还有其他方法可以管理资源:

Cleaning Up Unmanaged Resources

Implementing a Dispose Method

using Statement (C# Reference)

答案 2 :(得分:0)

如果你想在完成后运行某些东西,你应该实现IDisposable。