在处置模式中使用空条件运算符时 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 触发的主要内容,如果未能解决你的问题,请参考以下文章
为啥 FxCop 不报告 CA2000 对于这种未处置的类实例的琐碎情况?
MySQL 左连接时,查询条件查询某个字段为空或者为特定值解决方案