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

use*_*872 3 .net c# garbage-collection memory-management

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

当然这已经足够了:

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

        public void Dispose()
        {
            if ( _myManagedResource != null )
            {
                _myManagedResource.Dispose();
                _myManagedResource = null;
            }
        } 
    }
Run Code Online (Sandbox Code Playgroud)

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

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

能否确认以上内容正确?

Sco*_*ain 5

您几乎已经完成了,因为您的类没有密封,有人可以从您的类派生,并且该派生类也可能需要处置对象。让你的类密封起来,你当前的实现就很好。

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

    public void Dispose()
    {
        if ( _myManagedResource != null )
        {
            _myManagedResource.Dispose();
            _myManagedResource = null;
        }
    } 
}
Run Code Online (Sandbox Code Playgroud)

如果您想了解有关处置的更多信息(以及为什么 Microsoft 给出的带有终结器的股票示例实际上是一个坏示例),请参阅 Stepen Cleary 撰写的这篇非常好的文章:“ IDisposable:您的母亲从未告诉您有关资源释放的内容