您对如何在 .Net 中实现一次性对象有何看法?以及如何解决实现 IDisposable 类的重复性?
我觉得 IDisposable 类型不是他们应该成为的一等公民。太多的事情留给了开发商的摆布。
具体来说,我想知道是否应该在语言和工具中提供更好的支持,以确保正确实施和妥善处理一次性物品。
例如,在 C# 中,如果我的类需要实现一次性语义可以这样声明:
public class disposable MyDisposableThing
{
~MyDisposableThing()
{
// Dispose managed resources
}
}
在这种情况下,编译器可以轻松生成 IDisposable 接口的实现。析构函数 ~MyDisposableThing 可以转换为应该释放托管资源的实际 Dispose 方法。
中间 C# 代码如下所示:
public class MyDisposableThing : IDisposable
{
private void MyDisposableThingDestructor()
{
// Dispose my managed resources
}
~MyDisposableThing()
{
DisposeMe(false);
}
public void Dispose()
{
DisposeMe(true);
GC.SuppressFinalize(this);
}
private bool _disposed;
private void DisposeMe(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
// Call the userdefined "destructor"
MyDisposableThingDestructor();
}
}
_disposed = true;
}
}
这将使代码更简洁,更少的样板代码处置代码,以及处置托管资源的一致方式。对于边缘情况和非托管资源,仍然支持手动实现 IDisposable。
确保正确处理实例是另一个挑战。考虑以下代码:
private string ReadFile(string filename)
{
var reader = new StreamReader();
return reader.ReadToEnd(filename);
}
reader 变量永远不会超出方法的范围,但必须等待 GC 处理它。在这种情况下,编译器可能会引发 StreamReader 对象未显式释放的错误。此错误会提示开发人员将其包装在 using 语句中:
private string ReadFile(string filename)
{
using (var reader = new StreamReader())
{
return reader.ReadToEnd(filename);
}
}