2013-03-03 93 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

相關問題