C#IDisposable模式推荐的样板似乎没有必要

时间:2018-08-31 13:18:35

标签: c# .net

根据Microsoft正确实现IDisposable的推荐模式如下:

bool disposed = false;
// Instantiate a SafeHandle instance.
SafeHandle handle = new SafeFileHandle(IntPtr.Zero, true);

// Public implementation of Dispose pattern callable by consumers.
public void Dispose()
{ 
  Dispose(true);
  GC.SuppressFinalize(this);           
}

// Protected implementation of Dispose pattern.
protected virtual void Dispose(bool disposing)
{
  if (disposed)
     return; 

  if (disposing) {
     handle.Dispose();
     // Free any other managed objects here.
     //
  }

  disposed = true;
}

我认为这是不必要的。唯一应该使用您的时间是如果您拥有不受管理的资源。 Microsoft甚至将此模式包含在Visual Studio代码模板中。我的主要问题是,它会生成大量嘈杂和不必要的代码。首先,GC.SuppressFinalize(this);如果没有非托管代码(https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose),则不执行任何操作。其次,以下内容等效于2行而不是15行以上,以及用于跟踪的成员变量:

public void Dispose()
{
  handle?.Dispose();
  handle = null;
}

有想法吗?

0 个答案:

没有答案