c#中最简单的IDisposable模式是什么?

时间:2016-11-15 15:37:12

标签: c# .net memory-management garbage-collection

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

当然这已经足够了:

    public class ManagedResourceClient : IDisposable
    {
        private ITheManagedResource _myManagedResource = new TheManagedResource()

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

我没有看到任何使用理由:

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

上述情况可以确认为正确吗?

1 个答案:

答案 0 :(得分:4)

你几乎拥有它,因为你的类没有密封,有人可以从你的类派生,派生类也可能需要处理一个对象。让你的课程密封,你当前的实施是好的。

public sealed class ManagedResourceClient : IDisposable
{
    private ITheManagedResource _myManagedResource = new TheManagedResource()

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

如果你想了解更多关于处理的信息(以及为什么微软提供的Finializer的例子实际上是一个不好的例子),请参阅Stepen Cleary的这篇非常好的文章:" IDisposable: What Your Mother Never Told You About Resource Deallocation"