-1

我已经看过关于这个问题的帖子,但我似乎无法通过遵循此处的示例和其他在线位置来摆脱警告。你看到我错过了什么以避免得到CA2202 Warning说:

为避免生成 System.ObjectDisposedException,您不应在一个对象上多次调用 Dispose。

我认为 using 会处理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()在线。

4

1 回答 1

2

这个代码分析警告完全是胡扯。的合约IDisposable要求Dispose接受额外的调用并且什么都不做(特别是,它们不应该抛出ObjectDisposedException或任何其他异常)。

如果一个对象的Dispose方法被多次调用,该对象必须忽略第一次之后的所有调用。如果对象的方法被多次调用,则该对象不得抛出异常。Dispose其他实例方法可以在资源已被释放时Dispose抛出。ObjectDisposedException

来源:IDisposable.DisposeMSDN 上的文档

不幸的是,一些框架代码是在没有阅读合约的情况下编写的,并且禁止多次调用 Dispose。那些你应该小心不要重复处理的物品。但是通用合约仍然是任意的,允许多次IDisposable调用。Dispose

于 2020-08-25T18:19:57.960 回答