更改“ReproClass”上的 Dispose 方法以在此字段上调用 Dispose 或 Close
Posted
技术标签:
【中文标题】更改“ReproClass”上的 Dispose 方法以在此字段上调用 Dispose 或 Close【英文标题】:Change the Dispose method on 'ReproClass' to call Dispose or Close on this field 【发布时间】:2020-11-14 03:14:25 【问题描述】:我有一个直到最近的 VS2019 更新 (16.8.1) 才出现的问题
public class ReproClass : IDisposable
private readonly Mutex _mtx = new Mutex();
public void Dispose() => _mtx?.Dispose();
产生:
严重性代码描述项目文件行抑制状态 错误 CA2213 'ReproClass' 包含字段 'ReproClass._mtx' IDisposable 类型:“互斥锁”。更改“ReproClass”上的 Dispose 方法 在此调用 Dispose 或 Close 场地。 ShutterModeler path_to\ReproClass.cs 10 活动
我正在使用“代码分析”和“Microsoft Manager Miniumum Rules”集。
这似乎与 Code Analysis Warning CA2213 - Call Dispose() on IDisposable backing field 有关,但我没有使用 FXcop 也没有使用属性。
如何解决?
【问题讨论】:
我很好奇....如果您删除?
符号,问题会消失吗?
不要把所有的警告视为理所当然,用你的常识,不要害怕压制。
我和@JohnWu 在一起。您知道在提供的示例中 _mtx
不能为空,因此我建议删除 ?
(空传播运算符)。
@JohnWu 事实上,随着空检查传播器被删除,错误消失了。
【参考方案1】:
正如 John Wu 所建议的,空传播运算符是罪魁祸首。 CA2213 在这个实现中消失了:
public class ReproClass : IDisposable
private readonly Mutex _mtx = new Mutex();
public void Dispose() => _mtx.Dispose();
此实现将圈复杂度降低到 1,这在 Dispose()
中是所需的。
【讨论】:
以上是关于更改“ReproClass”上的 Dispose 方法以在此字段上调用 Dispose 或 Close的主要内容,如果未能解决你的问题,请参考以下文章
WCF 服务中的 NinjectServiceHost 不调用 Dispose()
在小部件的嵌套部分中使用 Provider 并出现 dispose() 错误