显式转换为IDisposable

时间:2011-07-02 12:18:44

标签: c# .net idisposable explicit-implementation

我正在使用一些XmlReaderXmlWriter对象对某些try...catch块内的字符串进行一些必要的工作。

我知道使用符号using (XmlReader NewReader = XmlReader.Create(...))是首选语法,但我并不喜欢这样,所以我也会附加finally块并执行NewReader.Close();和{{1} }。

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

问题是,在这些类中,Dispose()方法是明确实现的,因此我必须使用Dispose()((IDisposable)(NewReader)).Dispose();

这种技术有什么缺点吗?

3 个答案:

答案 0 :(得分:4)

有充分理由不使用using

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

并且没有理由避免using

  • “我真的不喜欢那样”

有充分理由适用于您的代码吗?

请注意,一个简单的扩展方法可以使语法更好,更干净。

答案 1 :(得分:1)

using语句确实是首选解决方案。这在C#中是惯用的。这些类显式实现IDisposable,因为它们已经提供了一个具有结束语义的方法:Close。我敢打赌,Dispose会调用Close,反之亦然。 但是你不应该依赖它,并且应该总是打电话给Dispose

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

  1. 使用using,这是首选;
  2. Close块上调用finally,并禁止静态分析警告或
  3. 致电Disposefinally
  4. 上的((IDisposable)NewReader).Dispose();

答案 2 :(得分:1)

C#using语句将始终为您调用Dispose。它倾向于翻译成以下内容:

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

所以将它包装在finally你自己不会增加任何价值。虽然CloseDispose通常是等效的,但情况并非总是如此。因为这个FxCop是对的,所以你应该总是调用Dispose,当你这样做时(或让using语句执行此操作),没有理由手动调用Close