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