【问题标题】:You should not call Dispose more than one time on an object (CA2202) [duplicate]您不应在一个对象上多次调用 Dispose(CA2202)[重复]
【发布时间】:2020-08-25 17:12:50
【问题描述】:

我已经看到有关此问题的帖子,但我似乎无法通过遵循此处的示例和其他在线位置来摆脱警告。你看到我缺少什么以避免得到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() 行。

【问题讨论】:

  • 当您退出 using 语句时,阅读器会自动释放。
  • 对@jdweng 的评论发表评论-xmlReaderstringReader 都将在正常退出using 语句块时或通过抛出的异常处理。
  • @Rich IDisposables 被IDisposable 消费的地方,在.Net 中很常见的是,消费的IDisposable 在消费时也会被处理。
  • @phuzi 需要明确的是,双重处置只是因为XmlReader 处置了StringReader。此处显示的代码不会双重处理。

标签: c# ca2202


【解决方案1】:

此代码分析警告完全是胡扯。 contract for IDisposable 要求接受对 Dispose 的额外调用并且不执行任何操作(特别是,它们不应抛出 ObjectDisposedException 或任何其他异常)。

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

来源:IDisposable.Dispose documentation on MSDN

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-10
    • 2015-05-14
    • 2023-03-04
    • 2019-04-29
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多