【发布时间】:2011-12-29 00:01:27
【问题描述】:
我知道 c# 中析构函数和终结函数在含义和使用上的区别。
但是,“我应该……”的答案通常是“不要使用析构函数,而是使用 MSDN 中所示的处置模式”。 Eric Lippert writes相当strongly反对不必要地使用析构函数。
但是,这种“模式”主张编写析构函数~T() { Dispose(false); }。声明的原因是它是一个“后备”,以防程序员忘记调用Dispose()。当然,这忽略了终结者在其操作中是不确定的,甚至可能永远不会运行的事实。
因此:
如果我使用 dispose 模式,我是否也应该提供析构函数?顺便说一句,我只处理托管资源(例如实体框架
DataContext)。如果我确实提供了析构函数:如果我的类派生自
IDisposable,它可能已经提供了析构函数,那么我是否也应该提供一个析构函数?我认为在这种情况下永远不会编写析构函数,但是文档说无论如何它都会自动调用基类的析构函数。
【问题讨论】:
-
SO 上已经有几十个类似的问题了。
-
你有一个 unmanaged 资源吗?
-
没有与其中之一相关的问题。我在问为什么这些答案中有一个 catch-22。
-
PS:MSDN 处理“模式”感觉像是一种包罗万象的方法,可以尽可能多地驯服边缘情况。但它过于复杂,文档有时令人困惑。
-
@PeterMarks 问题出在 MSDN 文档上——它仅在您使用非托管资源时记录了正确的实现。它提到应该在其他情况下使用
IDisposable,但“参考实现”在这些情况下不合适。
标签: c# destructor dispose