2014-09-04 15 views
2

通常,當我要檢查,比方說,一個構造函數的參數進行初始化,我不喜歡這樣寫道:使用契約驗證傳遞的參數?

public MyCtor(MyObj obj) { 
    if(obj == null) 
     throw new ArgumentNullException("obj"); 
} 

不過最近我stumpled在這個不錯的功能,從System.Diagnostics程序命名空間:

Contract.Requires<ArgumentNullException>(condition); 

這是否有同樣的效果?使用合同驗證參數時是否有任何缺點?

+0

合同允許您使用靜態代碼合同分析工具,它允許您在運行咖啡之前發現問題。 – Aron 2014-09-04 12:04:15

回答

2

是,除非:

,必須開啓運行時檢查使用需要方法。

(來自MSDN)。指示如何打開它必須在某個地方here

一種替代方法是CuttingEdge.Conditions

Condition.Requires(obj).IsNotNull(); 
Condition.Requires(myIntValue).IsGreaterThan(0); 
Condition.Requries(myString).IsNotNullOrWhitespace(); 

更多關於codeplex

這是做同樣的工作,但語法更簡單,更human可讀(在我看來) - 所以沒有缺點(但記住:它是基於意見的)。使用它,因爲我已經發現:)

+0

CuttingEdge.Conditions真的看起來不錯!但是,我在哪裏聲明拋出的異常呢? – xvdiff 2014-09-04 11:31:23

+0

@xvdiff它自動檢測到:)('IsNotNull'拋出'ArgumentNullException','IsGreaterThan'拋出'ArgumentOutOfRangeException')。對於自定義異常:'Condition.WithExceptionOnFailure ()。需要(集合).DoesNotContain(item);' – 2014-09-04 11:33:21