2012-03-10 17 views
1

我有一個xml解析代碼,我從xml解析多個節點和屬性。如果在我的代碼中使用短路,我可以避免,因爲我只想在正面情況下繼續處理。但我得到fxcop錯誤CA1002參數作爲用法。在條件流和CA1002 fxcop錯誤中使用out參數

我該如何刪除fxcorp錯誤?

public bool parseNode() 
{ 
    bool success = false; 
    string val1; 
    string val2; 
    string val3 

    success = TryGetAttributeValue(attribName1, out val1) && 
       TryGetAttributeValue(attribName2, out val2) && 
       TryGetAttributeValyue(attribName3, out val3); 

    if(success) 
    { 
     // do work 
    } 
} 

public bool TryGetAttributeValue(string attribName, out string value) 
{ 
} 
+2

CA1002似乎是「不要公開通用名單」。 http://msdn.microsoft.com/en-us/library/ms182142.aspx你確定這是正確的錯誤代碼? CA1021,「避免參數」? http://msdn.microsoft.com/en-us/library/ms182131.aspx – BACON 2012-03-10 05:55:48

回答

1

假設你實際上是在談論CA1021,這更符合你的描述:This is the MSDN article這個衝突。你可以在方法類型更改爲比publicprotected其他東西

否則(internal):

要解決違反了這一規則,是由價值型引起的,有 該方法返回對象作爲其返回值。如果方法必須返回多個值,請重新設計它以返回保存值的對象的單個實例。

如果您不能/願意更改保護類型或將代碼更改爲僅返回字符串,則您必須ignore this fxcop rule。哪一件,不是一件可怕的事情。你必須決定哪些規則看起來相關,哪些不規則。

您的代碼必須是類似於GetAttributeValue的東西,並且如果您想要避免此fxcop規則,請使用空值檢查。或者,您可以創建一個特殊的課程並使用Null object pattern,但這似乎太過矯枉過正。

最後,你在控制你的代碼,並不是所有規則都適用於每個人。

1

你確定它是CA1002嗎?因爲那個是根據谷歌的Do not expose generic lists規則。無論如何,我知道FxCop有規則使用out(和ref)參數,因爲它們不被認爲是面向對象的最佳實踐(你應該返回一個代表結果的對象)。

爲了擺脫警告,您需要將您的方法TryGetAttributeValue更改爲不使用out參數。

附註:微軟顯然在各種TryGetTryParse方法中違反了這條規則。所以只是因爲FxCop這麼說,它並不是一個不錯的選擇。

2

假設你正在談論CA1021避免了參數),而不是CA1002不要暴露泛型列表)的FxCop抱怨你TryGetAttributeValue()方法的out參數。

您可以重構該方法,使其返回屬性值,而不是將其存儲在out參數中,如果該屬性不存在,則返回null。從那裏,你可以使用null-coalescing操作??保持相同的控制流程:

public string TryGetAttributeValue(string attribName) 
{ 
    // Return attribute value, or null. 
} 

public bool ParseNode() 
{ 
    if ((TryGetAttributeValue(attribName1) 
     ?? TryGetAttributeValue(attribName2) 
     ?? TryGetAttributeValue(attribName3)) != null) { 
     // Do work. 
    } 
}