2013-08-21 23 views
0

我見過的代碼,其中包括Contract.Assert一樣,包括Contract.Assert是否對執行有影響?

Contract.Assert(t != null); 

將使用Contract.Assert對我的生產代碼產生負面影響?

+1

嗯它取決於..它的源將對性能產生影響,但我相信你可以*關閉*合同 - 以便它們不會被執行。這對準備用於生產的代碼來說很方便:) –

+0

如果通過「對性能的影響」,則表示斷言成功後立即從函數返回。這不太可能比實際的函數邏輯花費更長的時間。理想情況下,您只會將代碼發送到實際上正確的生產,即斷言不會失敗。 – millimoose

+0

我喜歡斷言,儘管他們搞砸了一些代碼,但他們可以節省大量時間來編寫已經寫好的單元測試代碼。 –

回答

4

根據第11頁上的manual,只有在定義了DEBUG符號(當然,包括調試版本,但不包括髮布版本(默認情況下))時,它們纔會包含在程序集中。

-1

至於良好的做法,最好有一套好的單元測試。那麼代碼合同並不是必需的。它們可能有幫助,但並不重要。

1

除了對Contract.Assert運行好處,你也可以考慮使用撥打電話遺留代碼,不具有合同定義的時候,如果你喜歡有靜態警告Contract.AssumeManual 2.5節第11頁)的替代(例如,靜態檢查級別more warningsall 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的運行時效益爲。

相關問題