2011-07-02 34 views
2

我正在使用一些XmlReaderXmlWriter对象来对某些try...catch块内的字符串做一些必要的工作。显式转换为IDisposable

我知道,使用符号using (XmlReader NewReader = XmlReader.Create(...))是首选语法,但我真的不喜欢那个,所以我也追加finally块和执行NewReader.Close();NewWriter.Close();

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

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

这种技术有什么缺点吗?

+7

为什么你不想使用using语句。它做你需要做的一切,你不会得到fxcop警告*,*它比使用try-finally更简洁。 – s1mm0t

回答

1

的C#using语句总是调用Dispose你。它roughtly转换为以下:

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

所以finally包裹它youself不添加任何价值。虽然CloseDispose往往是相同的,但情况并非总是如此。由于这个FxCop是正确的,你应该总是呼叫Dispose,当你这样做(或让using声明这样做),没有理由手动呼叫Close

1

using声明确实是首选解决方案。它在C#中是惯用的。这些类显式实现了IDisposable,因为它们已经提供了一个关闭语义的方法:Close。我敢打赌,Dispose调用Close,反之亦然。 但是你不应该指望这一点,并且总是应该总是致电Dispose

在结束时,所有这些是等效的:

  1. 使用using,这是优选的;
  2. 拨打Closefinally块,并抑制静态分析警告或;
  3. finally呼叫Dispose((IDisposable)NewReader).Dispose();
+0

不幸的是,'Close'和'Dispose'并不总是表现相同。除了明显的区别之外,关闭的实例通常可以重新打开,而处置的实例不能,当调用'Close'(例如'SqlConnection')时,某些对象不会抑制最终化,这会强制您调用Dispose来防止GC上的额外压力。 – Steven

+0

好点Steven,我已经相应更新了。 –

4

有充分的理由不使用using

  • 当对象的生命周期可能需要比当前块

存活期较长并有避免using不佳的原因:

  • “我不是很喜欢那个”

这个好理由适用于您的代码吗?

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

相关问题