2

我正在使用 someXmlReader和object 对某些块XmlWriter内的字符串做一些必要的工作。try...catch

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

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

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

这种技术有什么缺点吗?

4

3 回答 3

4

不使用有充分的理由using

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

并且有很多理由避免using

  • “我真的不喜欢那样”

充分的理由是否适用于您的代码?

另请注意,一个简单的扩展方法会使语法再次变得干净整洁。

于 2011-07-02T13:29:03.613 回答
1

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

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

  1. 使用using,这是首选;
  2. 调用块Closefinally并抑制静态分析警告或;
  3. 致电:Dispose_finally((IDisposable)NewReader).Dispose();
于 2011-07-02T12:28:08.017 回答
1

C#using语句将始终Dispose为您服务。它大致翻译为以下内容:

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

因此,将其包装在finally自己身上不会增加​​任何价值。尽管CloseDispose通常是等价的,但并非总是如此。因为这个 FxCop 是正确的,你应该总是调用Dispose,当你这样做(或让using语句这样做)时,没有理由Close手动调用。

于 2011-07-02T12:28:20.907 回答