Ani*_*nil 7 .net c# code-analysis fxcop visual-studio-2012
我有以下字符串扩展方法:
public static bool IsNullOrEmpty(this string target)
{
return string.IsNullOrEmpty(target);
}
Run Code Online (Sandbox Code Playgroud)
...在代码中我使用如下:
public static string DoSomethingOnString(this string target)
{
if (target.IsNullOrEmpty())
return target;
target = target.Trim(); //This line causes CA1062 violation
return target;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我对此运行代码分析,则会违反规则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;
}
Run Code Online (Sandbox Code Playgroud)
......那很好.
为什么它认为我在第一个例子中没有检查空状态?只有不会检查string.IsNullOrEmpty或string.IsNullOrWhiteSpace?有没有办法让CA识别我的扩展方法,或者我需要压制这个规则?
更新: 如果你有同样的问题,你可以在我的MS连接提交反馈项表决: 代码分析规则CA1062引发虚惊
Jon*_*eet 13
为什么它认为我在第一个例子中没有检查空状态?
很简单,FxCop不理解如果你的IsNullOrEmpty
扩展方法做同样的事情string.IsNullOrEmpty
.它没有意识到如果target
为null,IsNullOrEmpty
将返回true
并且您的方法将退出.基本上我怀疑它有内置的知识string.IsNullOrEmpty
.代码契约更有可能在这里取得成功,因为我相信与代码契约的深层推理相比,FxCop只会对代码的作用进行相对浅薄的检查.你可以装饰你的IsNullOrEmpty
方法ValidatedNotNullAttribute
来通知FxCop发生了什么.
public static bool IsNullOrEmpty([ValidatedNotNullAttribute] this string target)
{
return string.IsNullOrEmpty(target);
}
//The naming is important to inform FxCop
sealed class ValidatedNotNullAttribute : Attribute { }
Run Code Online (Sandbox Code Playgroud)
这只是代码分析有时候太急于批评的一个例子.这是我用过的几乎所有代码分析工具都能看到的东西.您的选择通常是:
您还应该记录错误或功能请求,当然......
归档时间: |
|
查看次数: |
3928 次 |
最近记录: |