您不应在一个对象上多次调用 Dispose(CA2202)[重复]
Posted
技术标签:
【中文标题】您不应在一个对象上多次调用 Dispose(CA2202)[重复]【英文标题】:You should not call Dispose more than one time on an object (CA2202) [duplicate] 【发布时间】: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 语句时,阅读器会自动释放。 请看***.com/a/75483/2641352 对@jdweng 的评论发表评论-xmlReader
和stringReader
都将在正常退出using
语句块时或通过抛出的异常处理。
@Rich IDisposable
s 被IDisposable
消费的地方,在.Net 中很常见的是,消费的IDisposable
在消费时也会被处理。
@phuzi 需要明确的是,双重处置只是因为XmlReader
处置了StringReader
。此处显示的代码不会双重处理。
【参考方案1】:
此代码分析警告完全是胡扯。 contract for IDisposable
要求接受对 Dispose
的额外调用并且不执行任何操作(特别是,它们不应抛出 ObjectDisposedException
或任何其他异常)。
如果多次调用对象的
Dispose
方法,则对象必须忽略第一次调用之后的所有调用。 如果对象的Dispose
方法被多次调用,则该对象不得抛出异常。 当资源已被释放时,Dispose
以外的实例方法可以抛出ObjectDisposedException
。
来源:IDisposable.Dispose
documentation on MSDN
不幸的是,一些框架代码是在没有阅读合约的情况下编写的,并且禁止多次调用 Dispose。那些你应该小心不要重复处理的物品。但通用合约仍然是对于任意IDisposable
,允许多次调用Dispose
。
【讨论】:
以上是关于您不应在一个对象上多次调用 Dispose(CA2202)[重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 Enzyme 测试 React 组件时出错:'不变违规:您不应在 <Router> 外使用 <Link>'
withRouter 参数解析 Invariant Violation 时出错:您不应在 <Router> 之外使用 <Route> 或 withRouter()
是否存在不应在常规 try 块上使用 try-with-resources 的情况?