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

Posted

技术标签:

【中文标题】在处置模式中使用空条件运算符时 CA2213 触发【英文标题】:CA2213 triggers when using null conditional operator in dispose pattern 【发布时间】: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 就是这样!谢谢! 【参考方案1】:

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

CA2213 triggers when using null conditional operator #291

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

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

【讨论】:

以上是关于在处置模式中使用空条件运算符时 CA2213 触发的主要内容,如果未能解决你的问题,请参考以下文章

VS代码分析CA1062即使在空检查后也会触发

如何在 WPF 中使用空条件运算符? [复制]

为啥 FxCop 不报告 CA2000 对于这种未处置的类实例的琐碎情况?

MySQL 左连接时,查询条件查询某个字段为空或者为特定值解决方案

MySQL 左连接时,查询条件查询某个字段为空或者为特定值解决方案

Java数值类型提升机制(三目条件运算符与空指针问题)