【问题标题】:CA2213 triggers when using null conditional operator in dispose pattern在处置模式中使用空条件运算符时 CA2213 触发
【发布时间】:2021-02-25 02:47:24
【问题描述】:

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

当我像这样实现我的 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”包含字段 IDisposable 类型的“HandlerBase.threadPool”:“SemaphoreSlim”。 将“HandlerBase”上的 Dispose 方法更改为调用 Dispose 或 Close on 这个字段。

【问题讨论】:

  • 也许它被 null 条件弄糊涂了?删除它,看看你是否仍然得到错误
  • @00110001 就是这样!谢谢!

标签: c# dispose static-analysis


【解决方案1】:

据怀疑,这似乎是 Roslyn 分析器的错误。

CA2213 triggers when using null conditional operator #291

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

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

【讨论】:

    猜你喜欢
    • 2016-07-13
    • 2019-07-12
    • 2015-06-13
    • 1970-01-01
    • 2017-08-25
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多