以下代码来自 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/

10-13 03:11