C# 显式转换为IDisposable
我正在使用一些C# 显式转换为IDisposable,c#,.net,idisposable,explicit-implementation,C#,.net,Idisposable,Explicit Implementation,我正在使用一些XmlReader和XmlWriter对象对一些try…catch块中的字符串执行一些必要的工作 我知道使用表示法using(XmlReader NewReader=XmlReader.Create(…)是首选语法,但我并不喜欢这样,所以我也在最后添加块并执行NewReader.Close()和NewWriter.Close() 然而,代码分析抱怨这些对象没有被释放,因此迫使我以某种方式调用Dispose()方法 问题是在这些类中,Dispose()方法是显式实现的,因此我必须使用
XmlReader
和XmlWriter
对象对一些try…catch
块中的字符串执行一些必要的工作
我知道使用表示法using(XmlReader NewReader=XmlReader.Create(…)
是首选语法,但我并不喜欢这样,所以我也在最后添加块并执行NewReader.Close()
和NewWriter.Close()代码>
然而,代码分析抱怨这些对象没有被释放,因此迫使我以某种方式调用Dispose()
方法
问题是在这些类中,Dispose()
方法是显式实现的,因此我必须使用((IDisposable)(NewReader)).Dispose()
和((IDisposable)(NewWriter)).Dispose()代码>
这种技术有什么缺点吗?使用语句确实是首选的解决方案。这是C#的惯用用法。这些类显式地实现了IDisposable
,因为它们已经提供了一个具有关闭语义的方法:Close
。我打赌Dispose
调用Close
,反之亦然。但你不应该指望这一点,无论如何都应该调用Dispose
最后,所有这些都是等效的:
使用使用,这是首选李>
调用finally
块上的Close
,并抑制静态分析警告或李>
在最后
:((IDisposable)NewReader.Dispose()上调用Dispose
代码>
C#using
语句将始终为您调用Dispose
。它大致可以转化为以下内容:
XmlReader NewReader = XmlReader.Create(...);
try
{
// do stuff on NewReader
}
finally
{
((IDisposable)NewReader).Dispose();
}
因此,最后将其包装在中不会增加任何价值。虽然Close
和Dispose
通常是等效的,但情况并非总是如此。因为这个FxCop是正确的,所以您应该始终调用Dispose
,当您执行此操作时(或者让using
语句执行此操作),没有理由手动调用Close
。不使用using
有很好的理由:
- 当对象的生存期可能需要比当前块更长时
避免使用
的理由也不充分:
- “我真的不喜欢那样”
好的理由是否适用于您的代码
还请注意,一个简单的扩展方法将使语法变得简洁明了。为什么不使用using语句呢。它完成了您需要执行的所有操作,您不会收到fxcop警告,而且它比使用try-finally更简洁。不幸的是,Close
和Dispose
的行为并不总是相同的。除了关闭的实例通常可以重新打开这一明显区别,而已释放的实例不能,一些对象在调用Close
(例如SqlConnection
)时不会抑制终结,这会强制您无论如何调用Dispose
,以防止对GC施加额外压力。