我正在使用一些XmlReader
和XmlWriter
对象对某些try...catch
块内的字符串进行一些必要的工作。
我知道使用符号using (XmlReader NewReader = XmlReader.Create(...))
是首选语法,但我并不喜欢这样,所以我也会附加finally
块并执行NewReader.Close();
和{{1} }。
然而,代码分析抱怨这些对象没有被处理掉,因此迫使我以某种方式调用NewWriter.Close();
方法。
问题是,在这些类中,Dispose()
方法是明确实现的,因此我必须使用Dispose()
和((IDisposable)(NewReader)).Dispose();
。
这种技术有什么缺点吗?
答案 0 :(得分:4)
有充分理由不使用using
:
并且没有理由避免using
:
有充分理由适用于您的代码吗?
请注意,一个简单的扩展方法可以使语法更好,更干净。
答案 1 :(得分:1)
using
语句确实是首选解决方案。这在C#中是惯用的。这些类显式实现IDisposable
,因为它们已经提供了一个具有结束语义的方法:Close
。我敢打赌,Dispose
会调用Close
,反之亦然。 但是你不应该依赖它,并且应该总是打电话给Dispose
。
最后,所有这些都是等价的:
using
,这是首选; Close
块上调用finally
,并禁止静态分析警告或Dispose
:finally
((IDisposable)NewReader).Dispose();
醇>
答案 2 :(得分:1)
C#using
语句将始终为您调用Dispose
。它倾向于翻译成以下内容:
XmlReader NewReader = XmlReader.Create(...);
try
{
// do stuff on NewReader
}
finally
{
((IDisposable)NewReader).Dispose();
}
所以将它包装在finally
你自己不会增加任何价值。虽然Close
和Dispose
通常是等效的,但情况并非总是如此。因为这个FxCop是对的,所以你应该总是调用Dispose
,当你这样做时(或让using
语句执行此操作),没有理由手动调用Close
。