【问题标题】:CA2213 warning when using ?. (null-conditional Operator) to call Dispose使用 ? 时出现 CA2213 警告。 (空条件运算符)调用 Dispose
【发布时间】:2016-07-13 18:11:21
【问题描述】:

我正在实现IDisposable,并且在我的Dispose() 方法中,当在其他托管资源上调用Dispose() 时,我正在使用?. 运算符,如下所示:

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if(disposing)
        {
            _ChangeLock?.Dispose();
        }
    }

我仍然收到以下code analysis error:

CA2213:“MyClass”包含 IDisposable 类型的字段“MyClass._ChangeLock”:“ReaderWriterLockSlim”。将“MyClass”上的 Dispose 方法更改为在该字段上调用 ​​Dispose 或 Close。

如果我更改为标准的空检查,代码分析警告就会消失:

if(_ChangeLock != null)
    _ChangeLock.Dispose();

像我这样使用空条件运算符有什么问题吗,或者这个代码分析规则已经过时了,还是什么?

【问题讨论】:

  • 需要更新的是CA规则。

标签: c# code-analysis idisposable


【解决方案1】:

这是 FxCop 的 known issue。

看来他们有decided not to fix it:

我们决定删减 [CA2213],因为如果没有更深入的分析、跟踪变量和可能的注释,很难做到正确。当前的实现非常嘈杂并且有很多误报,并且规则的价值不值得它产生的所有噪音。

【讨论】:

  • 这很可惜,因为我发现该规则在很多情况下都很有用。当有一个非常简单的解决方法或者它可以被用户抑制时,这似乎有点矫枉过正。
  • 此问题已在推荐的源代码分析器 Microsoft.CodeAnalysis.FxCopAnalyzers 上得到修复。再次查看问题。
猜你喜欢
  • 1970-01-01
  • 2016-04-07
  • 2015-01-05
  • 2015-06-13
  • 1970-01-01
  • 2021-11-15
  • 2017-09-06
  • 2022-08-12
  • 2023-03-20
相关资源
最近更新 更多