以下代码来自 MSDN:Idisposable pattern
protected virtual void Dispose(bool disposing)
{
// If you need thread safety, use a lock around these
// operations, as well as in your methods that use the resource.
if (!_disposed)
{
if (disposing) {
if (_resource != null)
_resource.Dispose();
Console.WriteLine("Object disposed.");
}
// Indicate that the instance has been disposed.
_resource = null;
_disposed = true;
}
}
为什么有以下说法:
_resource = null;
_disposed = true;
没有被 if (disposing) 语句块包围?
对我来说,我可能会这样写:
if (disposing) {
if (_resource != null) {
_resource.Dispose();
_resource = null;
_disposed = true;
}
Console.WriteLine("Object disposed.");
}
我的版本有什么问题吗?
最佳答案
MSDN 概述的模式是实现 IDisposable 的唯一正确方法,因为它考虑了终结。您需要仔细查看 IDisposable 实现:
public void Dispose()
{
Dispose(true);
// Use SupressFinalize in case a subclass
// of this type implements a finalizer.
GC.SuppressFinalize(this);
}
这会调用您的 dispose 方法,表明它是一个真正的 dispose 并抑制进一步的最终确定。
在完成期间调用任何其他对象是不安全的,所以这就是您要设置的原因:
_resource = null;
_disposed = true;
以防止任何进一步的事故。
这是 MSDN 上关于终结和 IDisposable 的 good info。
关于c# - 帮助我理解 MSDN 中的 Dispose() 实现代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2400426/