最近我开启了额外的代码分析规则。让我惊讶的是,在我一直认为是最佳实践的地方出现了违规情况。如果我有两个嵌套的可清理对象,我会像这样放置两个using语句:
using (StringReader strReader = new StringReader(xmlString))
using (XmlReader xmlReader = XmlReader.Create(strReader))
{
result.ReadXml(xmlReader);
}
这也对应于高评分的Q&A C#中嵌套使用语句
我收到的违规声明如下:
Warning 18 CA2202 : Microsoft.Usage : Object 'strReader' can be disposed more
than once in method '????'. To avoid generating a System.ObjectDisposedException
you should not call Dispose more than one time on an object.: Lines: ??
我所做的是一种直觉上的尝试和错误,认为关闭外部流也可能会处理内部流。我快速修复了我的代码,就像这样:
using (XmlReader xmlReader = XmlReader.Create(new StringReader(xmlString)))
{
result.ReadXml(xmlReader);
}
哎呀!警告消息已经消失了。但是,塔达!出现了一个新的警告:
Warning 18 CA2000 : Microsoft.Reliability : In method '????????', object
'new StringReader(xmlString)' is not disposed along all exception paths. Call
System.IDisposable.Dispose on object 'new StringReader(xmlString)' before all
references to it are out of scope.
然后我找到了一个非常丑陋的解决方案:
{
StringReader strReader = null;
try
{
strReader = new StringReader(xmlString);
using (XmlReader xmlReader = XmlReader.Create(strReader))
{
strReader = null;
result.ReadXml(xmlReader);
}
}
finally
{
if (strReader != null) strReader.Dispose();
}
}
作为最后一步(像每个好程序员一样),我查看了CA2202帮助页面,出乎意料的是,恰好我的最后一个丑陋的解决方案被提出来解决了这个问题?
在使用clutters时添加try{} finally会使代码非常混乱!对于我来说,嵌套的using更易读。
问题:有更好的方法吗?我正在寻找一种直观可理解的解决方案。每个看到这个片段的人都会好奇发生了什么。
提前感谢您的答案。
using (StringReader strReader = new StringReader(xmlString)) using (XmlReader xmlReader = XmlReader.Create(strReader)) { strReader = null; result.ReadXml(xmlReader); }
导致编译错误 Error 18 Cannot assign to 'strReader' because it is a 'using variable'。 - George Mamaladze