2011-02-17 44 views
2


我很想了解代碼合同的優點。我寫了下面的代碼(來自PEX +代碼合同介紹)來挖掘它。代碼合同和異常拋出差異

public static string TrimAfter(string value, string suffix) 
     { 
      // <pex> 
      Contract.Requires(suffix != (string)null); 
      Contract.Requires 
       (value.IndexOf(suffix) >= 0 && value.Length >= value.IndexOf(suffix)); 
      Contract.Requires(value != (string)null); 
      // </pex> 

      int index = value.IndexOf(suffix); 
      if (index < 0) 
       return value; 

      return value.Substring(0, index); 
     } 

我用null的參數調用了這個方法,並且它被編譯了。 因此,我不清楚爲什麼它會拋出Exceptions更好。 如果代碼合同真的有任何其他功能,你們可以解釋一下嗎? :) 在此先感謝。

+0

你爲什麼要將空值轉換爲字符串?這是沒有必要的。 – Massif 2011-02-17 12:59:12

回答

2
  1. 根據你的VS版本(Premium或Ultimate,如果我沒有記錯的話),你可以得到編譯時檢查。
    這個問題使靜態檢查器感到高興,這是相當多的工作。而且我不確定這是否值得大多數項目的努力。但是也許一個受限制的子集,比如空值檢查可以很好地工作。
  2. 可以從中自動生成文檔。
  3. 它代碼較短,使人們更有可能使用它。
    我的主要觀點。我很懶,如果寫檢查變得更容易,我更可能添加額外的檢查。特別是我發現舊樣式參數null檢查有點冗長。
  4. 如果需要,您可以指定一個異常,以便獲得與舊檢查相同的向外行爲。

另一方面,它不應該很難解析IL識別前置條件檢查和生成文檔的使用的舊標準模式。

1

我要去猜測,但是,從文檔:

一個Visual Studio添加 - 使您可以指定要執行的代碼合同分析的級別。分析人員可以確認合同格式良好(類型檢查和名稱解析),並且可以生成Microsoft中間語言(MSIL)格式的合同的編譯形式。在Visual Studio中創建合同可讓您利用該工具提供的標準IntelliSense。

工具可用here

3

除了作出的其他觀點之外,契約可以應用於接口(你不能用常規的例外來實現),並且通過繼承來強制執行(其他一些你很難處理的例外情況)。