代码分析规则CA1062的行为

12

我有以下字符串的扩展方法:

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条件?它只检查string.IsNullOrEmpty或string.IsNullOrWhiteSpace吗?有没有办法让CA识别我的扩展方法,还是我需要禁用这个规则?

更新: 如果您遇到了相同的问题,您可以在MS Connect上投票反馈项: Code Analysis rule CA1062 raises false alarm


违规出现在哪里?是在扩展方法中吗?还是在调用扩展方法之后?每当您在问题中提到错误/警告时,请显示其发生的位置。 - Jon Skeet
看一下 IL 代码,代码分析不会在你的 IDE 上看到的代码上运行,所以这可能会有所帮助。 - Gorgsenegger
你可以使用 ValidatedNotNullAttribute 让 FxCop 知道。更多信息请参见:http://esmithy.net/2011/03/15/suppressing-ca1062/ - Alex M
2个回答

18

为什么第一个例子中它认为我没有检查 null 条件?

简单来说,FxCop 不知道你的 IsNullOrEmpty 扩展方法是否与 string.IsNullOrEmpty 做了相同的事情。它不知道如果 target 为空,IsNullOrEmpty 将返回 true,并且你的方法将退出。基本上,我怀疑它内置了对 string.IsNullOrEmpty 的知识。 Code Contracts 更有可能在这里成功,因为我认为 FxCop 只对你的代码执行相对浅层的检查,而 Code Contracts 则进行深入的推理。你可以使用 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 { }

这只是代码分析有时过于热心批评的一个例子。我在使用过的每个代码分析工具中都看到过这种情况。你的选择通常是以下几种:
  • 更改您的代码以解决代码分析工具的问题,即使它之前运行良好
  • 在手动检查每个规则后,在特定站点禁止规则
  • 如果规则经常给出错误结果,则禁用整个规则
  • 完全放弃代码分析工具
当然,您还应该记录错误或提出功能请求...

我在代码示例中更新了注释,指出了导致违规的行。 - Anil
@Anil:没错 - 这只是 FxCop 不“理解”你的方法将要做什么的问题。 - Jon Skeet
感谢您的解释。我已经在MS Connect上提交了一个带有示例项目的反馈项。 - Anil

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接