2013-03-03 105 views
6

我有以下扩展名字符串的方法:代码分析规则CA1062行为

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; 
} 

...那么它是好的。

为什么它认为我没有检查第一个例子中的空状态?它是否只检查string.IsNullOrEmpty或string.IsNullOrWhiteSpace?有没有办法让CA识别我的扩展方法,或者我需要抑制这个规则?

UPDATE: 如果你有,你可以在反馈产品,投以同样的问题,我在MS连接提交: Code Analysis rule CA1062 raises false alarm

+0

*哪里*是违规?在扩展方法?在*到*的扩展方法中调用?或之后呢?每当你提到一个问题中的错误/警告时,*请*显示它出现在哪里。 – 2013-03-03 18:18:44

+0

查看IL代码,代码分析不会在您在IDE中看到的代码上运行,所以这可能会有所帮助。 – Gorgsenegger 2013-03-03 20:12:04

+0

你可以使用'ValidatedNotNullAttribute'让FxCop知道。更多信息:http://esmithy.net/2011/03/15/suppressing-ca1062/ – 2014-12-10 08:02:40

回答

10

为什么认为我不是在第一个检查空条件例?

很简单,FxCop不明白,如果您的IsNullOrEmpty扩展方法做的事情与string.IsNullOrEmpty相同。它不知道如果target为空,IsNullOrEmpty将返回true并且您的方法将退出。基本上我怀疑它有string.IsNullOrEmpty的内部知识。 Code Contracts在这里更有可能取得成功,因为我相信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 { } 

这只是一个代码分析有时可能有点太急于批评的例子。这是我用过的几乎所有代码分析工具都看到的。您的选择通常沿着线:

  • 更改您的代码来解决代码分析工具,即使之前
  • 禁止为罚款在特定位点的规则,经过人工检查他们每个人
  • 禁止整个规则,如果他们经常产生假阳性
  • 放弃的代码分析工具完全

你也应该记录错误或功能请求,当然,...

+0

我更新了代码示例,并对导致违规的行发表了评论。 – Anil 2013-03-03 19:56:02

+0

@Anil:对 - 这只是FxCop不能“理解”你的方法会做什么的问题。 – 2013-03-03 19:57:40

+0

@阿尼尔我编辑了我的答案,澄清了一下。 – 2013-03-03 20:01:30

相关问题