代码分析规则CA1062行为
本文关键字:CA1062 行为 规则 代码 | 更新日期: 2023-09-27 18:01:53
我有以下扩展字符串的方法:
public static bool IsNullOrEmpty(this string target)
{
return string.IsNullOrEmpty(target);
}
…在代码中我这样使用它:
public static string DoSomethingOnString(this string target)
{
if (target.IsNullOrEmpty())
return target;
target = target.Trim(); //This line causes CA1062 violation
return target;
}
现在,如果我对它运行代码分析,就会发现违反了规则CA1062。但是如果我把代码改成:
public static string DoSomethingOnString(this string target)
{
if (string.IsNullOrEmpty(target)) //CHANGED LINE
return target;
target = target.Trim(); //This line DOES NOT cause CA1062 violation anymore
return target;
}
…那就好了。
为什么它认为我在第一个例子中没有检查null条件?它是否只检查字符串。isnulloempty或string.IsNullOrWhiteSpace?是否有一种方法可以使CA识别我的扩展方法,或者我需要禁用此规则?
更新:如果你有同样的问题,你可以对我在MS Connect上提交的反馈项目进行投票:代码分析规则CA1062虚警
为什么它认为我在第一个例子中没有检查null条件?
很简单,如果您的IsNullOrEmpty
扩展方法与string.IsNullOrEmpty
做相同的事情,FxCop不会理解。它没有意识到,如果target
是空的,IsNullOrEmpty
将返回true
,你的方法将退出。基本上,我怀疑它有string.IsNullOrEmpty
的内置知识。代码契约在这里更有可能取得成功,因为我相信FxCop只对你的代码做了一个相对肤浅的检查,而不是代码契约的深度推理。你可以用ValidatedNotNullAttribute
修饰你的IsNullOrEmpty
方法来通知FxCop发生了什么。
public static bool IsNullOrEmpty([ValidatedNotNullAttribute] this string target)
{
return string.IsNullOrEmpty(target);
}
//The naming is important to inform FxCop
sealed class ValidatedNotNullAttribute : Attribute { }
这只是代码分析有时过于急于批评的一个例子。这是我在使用过的几乎所有代码分析工具中都看到的。您的选择通常是这样的:
- 更改代码以绕过代码分析工具,即使在 之前很好
- 在手动检查每个规则后,抑制特定站点的规则
- 如果规则经常误报,则抑制整个规则
- 完全放弃代码分析工具
你还应该记录一个错误或特性请求,当然…
看起来他们终于在roslyn分析器中修复了这个问题。
Bug报告在这里:https://github.com/dotnet/roslyn-analyzers/issues/2369