Вы не должны вызывать 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
допускается несколько раз.