使用时会出现CA2213警告?(null-conditional Operator)调用Dispose

Stu*_*gan 16 c# code-analysis idisposable

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

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

    protected virtual void Dispose(bool disposing)
    {
        if(disposing)
        {
            _ChangeLock?.Dispose();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我仍然收到以下代码分析错误:

CA2213:'MyClass'包含IDisposable类型的字段'MyClass._ChangeLock':'ReaderWriterLockSlim'.更改"MyClass"上的Dispose方法,在此字段上调用Dispose或Close.

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

if(_ChangeLock != null)
    _ChangeLock.Dispose();
Run Code Online (Sandbox Code Playgroud)

使用空条件运算符是否有问题,或者这个代码分析规则是否过时,或者是什么?

BJ *_*ers 21

这是FxCop的一个已知问题.

看来他们决定不解决它:

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

  • 不过,这很遗憾,因为我发现该规则在很多情况下都是有用的。当有一个非常简单的解决方法时,它看起来像是过度杀伤,或者它可以被用户抑制。 (2认同)