Вы не должны вызывать Dispose более одного раза для объекта (CA2202)

Я видел сообщения по этому вопросу, но не могу избавиться от предупреждения, следуя примерам здесь и в других местах в Интернете. Вы видите, чего мне не хватает, чтобы не получитьCA2202 Warning что говорит:

Чтобы избежать генерации System.ObjectDisposedException, не следует вызывать Dispose более одного раза для объекта.

Я думал, что использование избавит xmlReader. Он также избавляется отstringReader?

StringReader stringReader = null;
try
{
    stringReader = new StringReader(mOutputXmlString);
    using (XmlReader xmlReader = XmlReader.Create(stringReader, lXmlReaderSettings))
    {
        addResponse = (AddResponseStructure)mDeserializer.Deserialize(xmlReader);
        alertDetail = new AlertHostDetail(addResponse);
    }
}
catch
{
    _loggingManager.Log(LoggingHelpers.LoggingLevel.Error, "Error deserializing object.");
}
finally
{
    if (stringReader != null)
        stringReader.Dispose();
}

Предупреждение находится на stringReader.Dispose() линия.

1 ответ

Решение

Это предупреждение анализа кода - полная чушь. КонтрактIDisposable требует дополнительных вызовов Dispose принимаются и ничего не делают (в частности, они не должны бросать ObjectDisposedException или любое другое исключение).

Если объект Disposeметод вызывается более одного раза, объект должен игнорировать все вызовы после первого. Объект не должен вызывать исключение, если егоDisposeметод вызывается несколько раз. Методы экземпляра, отличные отDispose может бросить ObjectDisposedException когда ресурсы уже выброшены.

Источник: IDisposable.Dispose документация на MSDN

К сожалению, некоторый код фреймворка был написан без чтения контракта и запрещает вызывать Dispose более одного раза. Эти предметы вы должны быть осторожны, чтобы не утилизировать их дважды. Но универсальный договор остается условием произвольногоIDisposable, звоню Dispose допускается несколько раз.

Другие вопросы по тегам