Вложенные операторы using и анализ кода Microsoft

Недавно я включил дополнительные правила анализа кода. К своему удивлению, я обнаружил нарушение в месте, которое всегда считал оптимальным. Если у меня есть два вложенных одноразовых предмета, я помещаю два оператора 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, и, к моему удивлению, именно мое последнее УЖЕСТВЕННОЕ решение было предложено исправить проблема?

Попытка {} наконец-то обойтись без загромождения кода очень сильно! Для меня это вложенное использование гораздо более читабельно.

Вопрос: Есть ли способ лучше? Ищу решение, которое будет интуитивно понятным. Всем, кто увидит этот последний фрагмент, будет любопытно, что происходит.

Заранее благодарим за ответы.

25
задан Community 23 May 2017 в 10:29
поделиться