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

问题描述

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

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

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

我得到的错误

错误 CA1063:Microsoft.Design:修改 'HandlerBase.dispose()' 所以 它调用 dispose(true),然后调用 GC.SuppressFinalize 当前对象实例(Visual Basic 中的“this”或“Me”),然后 返回。

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

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

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

     disposed = true;
}

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

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

错误 CA2213:Microsoft.Usage:“HandlerBase”包含字段 'HandlerBase.threadPool' 是 Idisposable 类型:'SemaphoreSlim'。 更改“HandlerBase”上的 dispose 方法调用 dispose 或 Close 这个字段。

解决方法

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

CA2213 triggers when using null conditional operator #291

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

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