显式转换为IDisposable

本文关键字:IDisposable 显式转换 | 更新日期: 2023-09-27 18:00:51

我正在使用一些XmlReaderXmlWriter对象对一些try...catch块内的字符串执行一些所需的工作。

我知道使用符号using (XmlReader NewReader = XmlReader.Create(...))是首选的语法,但我并不喜欢这样,所以我还添加了finally块并执行NewReader.Close();NewWriter.Close();

然而,代码分析抱怨这些对象没有被处理,因此迫使我以某种方式调用Dispose()方法。

问题是,在这些类中,Dispose()方法是显式实现的,所以我必须使用((IDisposable)(NewReader)).Dispose();((IDisposable)(NewWriter)).Dispose();

这种技术有缺点吗?

显式转换为IDisposable

不使用using:有充分的理由

  • 当对象的生存期可能需要比当前块生存更长时间时

并且存在避免CCD_ 13:的不良原因

  • "我真的不喜欢那样">

合理的理由适用于您的代码吗?

还请注意,一个简单的扩展方法会使语法再次变得简洁明了。

C#using语句将始终为您调用Dispose。大致翻译如下:

XmlReader NewReader = XmlReader.Create(...);
try
{
   // do stuff on NewReader 
}
finally
{
    ((IDisposable)NewReader).Dispose();
}

因此,用finally自己包装它不会增加任何价值。尽管CloseDispose通常是等价的,但情况并非总是如此。正因为如此,FxCop是正确的,所以您应该始终调用Dispose,并且当您执行此操作时(或让using语句执行此操作(,没有理由手动调用Close

using语句确实是首选解决方案。这是C#中的惯用语。这些类显式地实现IDisposable,因为它们已经提供了一个具有关闭语义的方法:Close。我打赌Dispose调用Close,反之亦然但你不应该指望这一点,无论如何都应该打电话给Dispose

最终,所有这些都是等价的:

  1. 优选使用using
  2. finally块上调用Close,并抑制静态分析警告或
  3. finally:((IDisposable)NewReader).Dispose();上调用Dispose