我最近不得不实现 Dispose() 功能,并且遇到了 1 行方法、2 行方法和更全面的方法。
一个 1 行方法/函数会简单地调用类似“context.Dispose”的东西,但我选择的方法是这样的:
bool _disposed = false;
public void Dispose(bool disposing)
{
if (!_disposed && disposing)
{
_context.Dispose();
}
_disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
这个语法仅仅是为了阻止 Dispose() 被多次调用吗?
最佳答案
您发布的部分是 Dispose Pattern .正如有人指出的那样,终结器(“析构函数”)中应该有相应的 Dispose(false)
。终结器应该用于处理非托管资源。如果您没有要处理的非托管资源(即当 disposing
为 false
时您无事可做),则不需要 Dispose(false)
因此不需要终结器。这意味着 Dispose(true)
是唯一的路径,因此您不需要 Dispose (bool)
(因此不需要实现 Dispose 模式)和可以将它的主体移动到 Dispose
(并删除对 disposing
的检查)并只实现 Dispose
。例如:
public void Dispose()
{
_context.Dispose();
}
没有实现自己的终结器(析构函数)的类不会放在终结器列表中,因此无需调用 GC.SuppressFinalize
。
一般来说,如果您要创建一个类,这就足够了。但是,有时您可以从实现此模式的类派生。在这种情况下,您应该在您的类中实现对它的支持(覆盖 Dispose(bool)
并执行 disposing
检查和 Dispose
任何托管资源).由于基类实现了 IDisposable
并在其 Dispose()
中调用了一个 virtual Dispose(bool)
,因此您无需实现 Dispose()
自己,但是你必须在你的 Dispose(bool)
中调用 base 的 Dispose(bool)
。例如:
protected override void Dispose(bool disposing)
{
if(disposing) _context.Dispose();
base.Dispose(disposing);
}
如果您正在调用基础并且它实现了 Dispose 模式,那么您也不需要调用 GC.SuppressFinalize()
,因为它已经在这样做了。
如果你愿意,你可以做整个disposed
的事情;不过,我发现它隐藏了多处理错误。
关于c# disposing 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12130311/