关于.net:c#中最简单的IDisposable模式是什么?

What is the simplest IDisposable pattern in c#?

本问题已经有最佳答案,请猛点这里访问。

如果我有一个只使用托管资源的类,那么我认为不需要完全实现IDisposable模式。

这当然足够了:

1
2
3
4
5
6
7
8
9
10
11
12
13
    public class ManagedResourceClient : IDisposable
    {
        private ITheManagedResource _myManagedResource = new TheManagedResource()

        public void Dispose()
        {
            if ( _myManagedResource != null )
            {
                _myManagedResource.Dispose();
                _myManagedResource = null;
            }
        }
    }

我看不出使用的理由:

  • 终结器,因为它只使用实现IDisposable的托管资源
  • "disposing"标志,因为这是由空检查处理的
  • 虚拟处理方法,因为不需要区分GC调用和直接调用。

以上内容是否正确?


您几乎拥有它,因为您的类不是密封的,所以有人可以从您的类派生,并且派生类也可能需要释放一个对象。使类密封,并且当前的实现是良好的。

1
2
3
4
5
6
7
8
9
10
11
12
13
public sealed class ManagedResourceClient : IDisposable
{
    private ITheManagedResource _myManagedResource = new TheManagedResource()

    public void Dispose()
    {
        if ( _myManagedResource != null )
        {
            _myManagedResource.Dispose();
            _myManagedResource = null;
        }
    }
}

如果你想了解更多关于处理(以及为什么微软给出的带有限定符的股票例子实际上是一个坏例子)的信息,请参阅Stepen Cleary的这篇非常好的文章:"IDisposable:什么是你妈妈从来没有告诉过你的关于资源分配的。"