代码分析规则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虚警

代码分析规则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