2011-11-28 25 views
9

假設所有新的.NET 4.0代碼我應該在發佈版本上打開.NET 4.0代碼合同的運行時檢查嗎?

我看到有選項可以打開它們。但是我不明白最佳實踐是什麼?

靜態檢查完成後,您真的不需要執行運行時檢查(因爲編譯器確保滿足條件)是最佳實踐嗎?或者在有些情況下,即使編譯器爲您檢查了它,仍然有可能在運行時期間不滿足條件?

任何好的在線討論或文章。我看到很多解釋瞭如何做但不是很多解釋哪一個是最好的做法,假設所有新的.NET 4.0代碼都不需要向後兼容性。

回答

5

因爲編譯器確認條件滿足了嗎?

這將是非常難得的是,靜態驗證將能夠驗證整個應用程序。我們通常會選擇主要部分。

我應該在發佈版本上打開.NET 4.0代碼合同的運行時檢查嗎?

可能不是選項,但較輕的像前提條件只有之一。

對於性能嚴重的代碼,您可能需要完全關閉它們。

4

這取決於您使用Requires的方式。

如果使用「自定義合同要求」模式:

public void SomeMethod(SomeClass x) 
{ 
    if (x == null) throw new ArgumentNullException("x"); 
    Contract.EndContractBlock(); 

    ... 
} 

你可以安全的打開運行時檢查過,並保持你的錯誤檢查和異常

如果使用「標準合同要求」模式:

public void SomeMethod(SomeClass x) 
{ 
    Contract.Requires<ArgumentNullException>(x != null); 

    ... 
} 

您應該將運行時檢查轉換爲至少'ReleaseRequires'級別。否則你會失去所有的錯誤檢查,並可能會得到意外的異常(如NullReferenceException某處深的代碼,而不是ArgumentNullException公衆表面上)

我不會用檢查,原因很簡單的較高水平:如果有的話Contract.Requires<E>以外的合同失敗,運行時將拋出一個System.Diagnostics.ContractException這可能不會請用戶。

順便說一句,亨克霍爾特曼是絕對正確的,靜態驗證是有限的,你不應該完全依賴它。

相關問題