bil*_*lpg 2 c# dispose idisposable using
我有一个带有Dispose
函数的C#类IDisposable
.它旨在用于using
块内,因此它可以立即释放它所处理的昂贵资源.
问题是在Dispose
调用之前抛出异常时发生了一个错误,并且程序员忽略了使用using
或finally
.
在C++中,我从来不必担心这一点.对类的析构函数的调用将自动插入到对象范围的末尾.避免这种情况发生的唯一方法是使用new运算符并将对象保持在指针后面,但这对于程序员来说需要额外的工作并不是他们偶然会做的事情,比如忘记使用using
.
是否有任何方法using
可以在C#中自动使用块?
非常感谢.
更新:
我想解释为什么我不接受终结者答案.这些答案本身在技术上是正确的,但它们不是C++风格的析构函数.
这是我发现的错误,简化为必需品......
try
{
PleaseDisposeMe a = new PleaseDisposeMe();
throw new Exception();
a.Dispose();
}
catch (Exception ex)
{
Log(ex);
}
// This next call will throw a time-out exception unless the GC
// runs a.Dispose in time.
PleaseDisposeMe b = new PleaseDisposeMe();
Run Code Online (Sandbox Code Playgroud)
使用FXCop
是一个很好的建议,但如果这是我唯一的答案,我的问题必须成为C#人的请求,或使用C++.二十个嵌套使用语句的人吗?
在我工作的地方,我们使用以下准则:
为了让我们的生活更轻松,我们在我们的基础结构中也有一个SafeDispose方法,它在try-catch块中调用其参数的Dispose方法(带有错误记录),以防万一(尽管Dispose方法不应该抛出异常) ).
另见:Chris Lyon关于IDisposable的建议
编辑:@Quarrelsome:你应该做的一件事是在'Dispose'中调用GC.SuppressFinalize,这样如果对象被处理掉,它就不会被"重新处理".
通常还建议保持一个标志,指示物体是否已被丢弃.以下模式通常非常好:
class MyDisposable: IDisposable {
public void Dispose() {
lock(this) {
if (disposed) {
return;
}
disposed = true;
}
GC.SuppressFinalize(this);
// Do actual disposing here ...
}
private bool disposed = false;
}
Run Code Online (Sandbox Code Playgroud)
当然,锁定并不总是必要的,但如果你不确定你的类是否会在多线程环境中使用,建议保留它.
归档时间: |
|
查看次数: |
2014 次 |
最近记录: |