最近我打開了其他代碼分析規則。 令我驚訝的是,我在一個我一直認爲是最佳實踐的地方看到了違規行爲。 如果我有兩個嵌套的一次性用品,我把兩個using語句是這樣的:使用語句和Microsoft代碼進行嵌套分析
using (StringReader strReader = new StringReader(xmlString))
using (XmlReader xmlReader = XmlReader.Create(strReader))
{
result.ReadXml(xmlReader);
}
這也相當於高額定Q &一個 Nested using statements in 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);
}
Hura!警告消失了。但是,田田!新一發生:
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讓我吃驚準確我提出的最後一個UGLY解決方案是爲了解決這個問題?
嘗試{}終於圍繞使用雜亂的代碼非常多!對我來說,嵌套使用更可讀。
問:有沒有更好的做事方式?我正在尋找一種可以直觀理解的解決方案。每個看到最後一個片段的人都會對發生的事情充滿好奇心。
在此先感謝您的答案。
像您這樣的問題在您的P.S.中有過。可能屬於MetaStackoverflow。事實上,這個問題可能已經在那裏被提出並回答了。 –
通過使用(的XmlReader的XmlReader = XmlReader.Create(strReader))我嘗試的方式也以下代碼 '使用(StringReader strReader =新StringReader(的xmlString)) { strReader = NULL; result.ReadXml(xmlReader); }' } 導致編譯錯誤錯誤無法分配給'strReader',因爲它是'使用變量' –