Gần đây tôi đã bật các quy tắc phân tích mã bổ sung. Trước sự ngạc nhiên của tôi, tôi đã thấy một sự vi phạm ở một nơi mà tôi luôn xem là thực hành tốt nhất. Nếu tôi có hai lần hiện lồng nhau Tôi đặt hai sử dụng báo cáo như thế này:Báo cáo sử dụng lồng nhau và mã Microsoft Phân tích
using (StringReader strReader = new StringReader(xmlString))
using (XmlReader xmlReader = XmlReader.Create(strReader))
{
result.ReadXml(xmlReader);
}
này cũng tương ứng với đánh giá cao Q & Một Nested using statements in C#
Vi phạm tôi nhận được tình trạng sau:
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: ??
Những gì tôi đã làm là một thử trực quan và lỗi, nghĩ rằng gần của dòng bên ngoài cũng sẽ có thể vứt bỏ một bên trong tôi nhanh chóng sửa mã của tôi như thế này:
using (XmlReader xmlReader = XmlReader.Create(new StringReader(xmlString)))
{
result.ReadXml(xmlReader);
}
Hura! Cảnh báo đã biến mất. Nhưng, tada! Người mới xảy ra:
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.
Sau đó, tôi tìm thấy một giải pháp rất xấu xí:
{
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();
}
}
Là một bước cuối cùng (như mọi lập trình viên tốt) Tôi nhìn vào trang trợ giúp cho CA2202 và trước sự ngạc nhiên của tôi chính xác giải pháp UGLY cuối cùng của tôi đã được đề xuất để khắc phục vấn đề này?
Có cố gắng {} cuối cùng xung quanh bằng cách sử dụng cắt mã rất nhiều! Đối với tôi là lồng được sử dụng dễ đọc hơn nhiều.
Câu hỏi: Có cách nào tốt hơn để làm việc không? Tôi đang tìm một giải pháp mà sẽ trực giác dễ hiểu. Tất cả những người sẽ thấy đoạn trích cuối cùng này sẽ là những lời tò mò về những gì đang xảy ra.
Cảm ơn trước vì câu trả lời của bạn.
Các câu hỏi như bạn đã có trong P.S. có thể thuộc về MetaStackoverflow. Trong thực tế, câu hỏi đó có thể đã được hỏi và trả lời ở đó. –
Bằng cách này tôi đã cố gắng cũng mã sau 'sử dụng (StringReader strReader = new StringReader (xmlString)) sử dụng (XmlReader XmlReader = XmlReader.Create (strReader)) { strReader = null; kết quả.ReadXml (xmlReader); } ' dẫn đến lỗi biên dịch Lỗi Không thể gán cho 'strReader' vì nó là 'sử dụng biến' –