显式转换为IDisposable
本文关键字:IDisposable 显式转换 | 更新日期: 2023-09-27 18:00:51
我正在使用一些XmlReader
和XmlWriter
对象对一些try...catch
块内的字符串执行一些所需的工作。
我知道使用符号using (XmlReader NewReader = XmlReader.Create(...))
是首选的语法,但我并不喜欢这样,所以我还添加了finally
块并执行NewReader.Close();
和NewWriter.Close();
。
然而,代码分析抱怨这些对象没有被处理,因此迫使我以某种方式调用Dispose()
方法。
问题是,在这些类中,Dispose()
方法是显式实现的,所以我必须使用((IDisposable)(NewReader)).Dispose();
和((IDisposable)(NewWriter)).Dispose();
。
这种技术有缺点吗?
不使用using
:有充分的理由
- 当对象的生存期可能需要比当前块生存更长时间时
并且存在避免CCD_ 13:的不良原因
- "我真的不喜欢那样">
合理的理由适用于您的代码吗?
还请注意,一个简单的扩展方法会使语法再次变得简洁明了。
C#using
语句将始终为您调用Dispose
。大致翻译如下:
XmlReader NewReader = XmlReader.Create(...);
try
{
// do stuff on NewReader
}
finally
{
((IDisposable)NewReader).Dispose();
}
因此,用finally
自己包装它不会增加任何价值。尽管Close
和Dispose
通常是等价的,但情况并非总是如此。正因为如此,FxCop是正确的,所以您应该始终调用Dispose
,并且当您执行此操作时(或让using
语句执行此操作(,没有理由手动调用Close
。
using
语句确实是首选解决方案。这是C#中的惯用语。这些类显式地实现IDisposable
,因为它们已经提供了一个具有关闭语义的方法:Close
。我打赌Dispose
调用Close
,反之亦然但你不应该指望这一点,无论如何都应该打电话给Dispose
最终,所有这些都是等价的:
- 优选使用
using
-
在finally
块上调用Close
,并抑制静态分析警告或 - 在
finally
:((IDisposable)NewReader).Dispose();
上调用Dispose