Недавно я включил дополнительные правила анализа кода. К своему удивлению, я обнаружил нарушение в месте, которое всегда считал оптимальным. Если у меня есть два вложенных одноразовых предмета, я помещаю два оператора using, как это:
using (StringReader strReader = new StringReader(xmlString))
using (XmlReader xmlReader = XmlReader.Create(strReader))
{
result.ReadXml(xmlReader);
}
Это также соответствует высокому рейтингу вопросов и ответов Вложенные операторы using в C #
Нарушение I get сообщает следующее:
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, и, к моему удивлению, именно мое последнее УЖЕСТВЕННОЕ решение было предложено исправить проблема?
Попытка {} наконец-то обойтись без загромождения кода очень сильно! Для меня это вложенное использование гораздо более читабельно.
Вопрос: Есть ли способ лучше? Ищу решение, которое будет интуитивно понятным. Всем, кто увидит этот последний фрагмент, будет любопытно, что происходит.
Заранее благодарим за ответы.