2013-01-02 82 views
3

當使用代碼契約,我得到了警告:如何代碼契約使用的TryParse沒有得到警告

檢測調用方法 「System.Int32.TryParse(System.String,System.Int32 @)」沒有方法

具有與像下面的代碼的inteface定義的接口和代碼合同一類 合同[純]。問題是如何檢查字符串orgNumberWithoutControlDigit可以轉換爲一個有效的整數,因爲它是模數工作的先決條件?

public string getControlDigit(string orgNumberWithoutControlDigit) 
    { 
     List<int> orgNumberNumbers = this.getNumberList(orgNumberWithoutControlDigit); 

     List<int> productList = orgNumberNumbers.Zip(this.weightNumberList, (first, second) => first * second).ToList(); 

     int modular = productList.Sum() % 11; 

     string controlDigit = getControlDigit(modular); 

     return controlDigit; 
    } 

private static string getControlDigit(int modular) 
    { 
     string controlDigit; 


     if (modular == 0) 
     { 
      controlDigit = "0"; 
     } 
     else if (modular == 1) 
     { 
      controlDigit = "-"; 
     } 
     else 
     { 
      int result = 11 - modular; 
      controlDigit = result.ToString(); 
     } 


     return controlDigit; 
    } 

[ContractClass(typeof(CalculateOrgNumberControlDigitBusinessContract))] 
public interface ICalculateOrgNumberControlDigitBusiness 
{ 
    string getControlDigit(string orgNumberWithoutControlDigit); 
} 


[ContractClassFor(typeof(ICalculateOrgNumberControlDigitBusiness))] 
public abstract class CalculateOrgNumberControlDigitBusinessContract:ICalculateOrgNumberControlDigitBusiness 
{ 
    public string getControlDigit(string orgNumberWithoutControlDigit) 
    { 
     Contract.Requires(orgNumberWithoutControlDigit.Length == 8); 
     int parseResult; 
     Contract.Requires(int.TryParse(orgNumberWithoutControlDigit, out parseResult)); 
     Contract.Ensures(parseResult >= 0); 
     var result = Contract.Result<string>(); 
     Contract.Ensures(result != null && result.Length == 1); 

     return default(string); 
    } 
} 
+0

閱讀「純度」,地址爲:http://msdn.microsoft.com/en-us/library/dd264808.aspx –

回答

1

我知道你想達到什麼樣的,但是我要說的是,經過orgNumberWithoutControlDigit作爲一個字符串getControlDigit [原文]是真正的罪魁禍首這裏。

即使您可以使您的合同工作 - 調用者也必須將字符串轉換爲int以滿足您的合同。現在,如果調用者已經將該轉換轉換爲int類型,爲什麼不讓它通過int來代替呢?

我是Code Contracts的忠實粉絲,在我的大部分項目中都使用它,並且我已經瞭解到它不是一顆銀色的子彈。所以,如果你必須有一個字符串參數,完全刪除合同,並且只需確保你的字符串在使用前是有效的格式。

也許一個OrgNumberValidator幫手會比依靠這個合同更好的選擇嗎?

編輯:其實,我會建議創建一個OrgNumber類來處理它們。

1

您可以創建一個純粹的輔助方法,而不是直接調用int.TryParse

[Pure] 
private static bool IsInt(string s) 
{ 
    int n; 
    return int.TryParse(s, out n); 
} 

你可以走得更遠,並在try塊包裹TryParse,返回false如果任何類型的異常被拋出(剛需在安全的一面)。

但是,我傾向於分享邁克爾的觀點,即如果可以的話,避免傳遞字符串來表示整數,您會做得更好。

+0

是的。另外我在代碼合同中發現的一點是,您可以設計'for'合同,但只要您需要這些純粹的助手來獲得合同,那麼您就可以做到這一點。 如果你設計了一個類,你不應該將實現添加到該類中去,只是爲了獲得合同。這只是一個糟糕的合同的症狀。你同意嗎? –

+0

@MichaelViktorStarberg這是一個有趣的觀點。我當然會同意,添加純助手的需要提出了一種複雜的輸入或輸出方法,這可能是簡化它們的一個機會(並且避免需要幫助者)。 –