更改“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()

SerialPort 类偶尔会挂在 Dispose 上

在小部件的嵌套部分中使用 Provider 并出现 dispose() 错误

在 MS 访问文件上使用 dispose 和 SuppressFinalize 后文件已在使用中的异常

垃圾回收

C# IDisposable 类,正确使用 Dispose,获取错误“dispose”需要 1 个参数