根据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;
}
有想法吗?