我見過的代碼,其中包括Contract.Assert
一樣,包括Contract.Assert是否對執行有影響?
Contract.Assert(t != null);
將使用Contract.Assert
對我的生產代碼產生負面影響?
我見過的代碼,其中包括Contract.Assert
一樣,包括Contract.Assert是否對執行有影響?
Contract.Assert(t != null);
將使用Contract.Assert
對我的生產代碼產生負面影響?
根據第11頁上的manual,只有在定義了DEBUG
符號(當然,包括調試版本,但不包括髮布版本(默認情況下))時,它們纔會包含在程序集中。
至於良好的做法,最好有一套好的單元測試。那麼代碼合同並不是必需的。它們可能有幫助,但並不重要。
除了對Contract.Assert
運行好處,你也可以考慮使用撥打電話遺留代碼,不具有合同定義的時候,如果你喜歡有靜態警告Contract.Assume
(Manual 2.5節第11頁)的替代(例如,靜態檢查級別more warnings
或all warnings
- 級別3+ - 和Show Assumptions
開啓)。
Contract.Assume
給你同樣的運行時間好處Contract.Assert
,而且抑制,不能因爲傳統裝配被證明是靜態檢查。
例如在下面的代碼,啓用靜態檢查和警告設置爲3級檢查MethodDoesNotAllowNull
var aString = Legacy.MethodWithNoContract();
MethodDoesNotAllowNull(aString);
private void MethodDoesNotAllowNull(string someString)
{
Contract.Requires(someString != null);
}
藉助舊版彙編代碼合同時給出了warning : CodeContracts: requires unproven: someString != null
:
public static string MethodWithNoContract()
{
return "I'm not really null :)";
}
Assume
抑制警告(但給人運行時間Assert在調試版本中受益):
var aString = LegacyAssembly.LegacyMethodWithNoContract();
Contract.Assume(aString != null);
MethodDoesNotAllowNull(aString);
這樣,您仍然可以獲得在調試版本中,Contract.Assert
的運行時效益爲。
嗯它取決於..它的源將對性能產生影響,但我相信你可以*關閉*合同 - 以便它們不會被執行。這對準備用於生產的代碼來說很方便:) –
如果通過「對性能的影響」,則表示斷言成功後立即從函數返回。這不太可能比實際的函數邏輯花費更長的時間。理想情況下,您只會將代碼發送到實際上正確的生產,即斷言不會失敗。 – millimoose
我喜歡斷言,儘管他們搞砸了一些代碼,但他們可以節省大量時間來編寫已經寫好的單元測試代碼。 –