在处置模式中使用空条件运算符时触发 CA2213

CA2213 triggers when using null conditional operator in dispose pattern

我正在开发一个将静态代码分析设计警告视为错误的代码库。

当我像这样实现 Dispose() 方法时:

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

我得到的错误

error CA1063: Microsoft.Design : Modify 'HandlerBase.Dispose()' so that it calls Dispose(true), then calls GC.SuppressFinalize on the current object instance ('this' or 'Me' in Visual Basic), and then returns.

所以我修改它以遵循 CA1063 预期的模式

protected virtual void Dispose(bool disposing)
{
     if (disposed)
     {
         return;
     }

     if (disposing)
     {
         threadPool?.Dispose();
     }

     disposed = true;
}

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

并且它不再意识到我正在处置对象:

error CA2213: Microsoft.Usage : 'HandlerBase' contains field 'HandlerBase.threadPool' that is of IDisposable type: 'SemaphoreSlim'. Change the Dispose method on 'HandlerBase' to call Dispose or Close on this field.

正如所怀疑的那样,这似乎是 Roslyn 分析器的一个错误。

CA2213 triggers when using null conditional operator #291

似乎在以后的版本中修复了(如果我没看错的话);但是,如果这不适用于您,或者它仍然无法正常工作,您可以取消 warning/error 或只是删除 null 条件并手动检查 null:

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