假設所有新的.NET 4.0代碼我應該在發佈版本上打開.NET 4.0代碼合同的運行時檢查嗎?
我看到有選項可以打開它們。但是我不明白最佳實踐是什麼?
靜態檢查完成後,您真的不需要執行運行時檢查(因爲編譯器確保滿足條件)是最佳實踐嗎?或者在有些情況下,即使編譯器爲您檢查了它,仍然有可能在運行時期間不滿足條件?
任何好的在線討論或文章。我看到很多解釋瞭如何做但不是很多解釋哪一個是最好的做法,假設所有新的.NET 4.0代碼都不需要向後兼容性。
假設所有新的.NET 4.0代碼我應該在發佈版本上打開.NET 4.0代碼合同的運行時檢查嗎?
我看到有選項可以打開它們。但是我不明白最佳實踐是什麼?
靜態檢查完成後,您真的不需要執行運行時檢查(因爲編譯器確保滿足條件)是最佳實踐嗎?或者在有些情況下,即使編譯器爲您檢查了它,仍然有可能在運行時期間不滿足條件?
任何好的在線討論或文章。我看到很多解釋瞭如何做但不是很多解釋哪一個是最好的做法,假設所有新的.NET 4.0代碼都不需要向後兼容性。
因爲編譯器確認條件滿足了嗎?
這將是非常難得的是,靜態驗證將能夠驗證整個應用程序。我們通常會選擇主要部分。
我應該在發佈版本上打開.NET 4.0代碼合同的運行時檢查嗎?
可能不是全選項,但較輕的像前提條件只有之一。
對於性能嚴重的代碼,您可能需要完全關閉它們。
這取決於您使用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
這可能不會請用戶。
順便說一句,亨克霍爾特曼是絕對正確的,靜態驗證是有限的,你不應該完全依賴它。