2013-03-18 29 views
8

今天我讀到了關於C#4.0代碼契約的內容。這似乎是在驗證參數的方法常見的做法是不爲空如下:C#代碼契約 - 避免檢查空引用的參數

Contract.Requires(p != null); 

但是它似乎很不合理,我認爲我必須爲每一個接口方法的每一個參數做到這一點在我的代碼中。在絕大多數情況下,參數預計不會爲空。我預計會有某種機制允許定義一些特定參數爲「允許」爲null(類似於Java中的「@Nullable」註釋),並且Contracts框架將自動確保其餘部分不會空值。

除了在這個「樣板檢查」(以及許多「合同類」)上節省了大量時間外,它還可以使許多時候沒有任何條件需要驗證,除非非空參數)合同代碼更清潔,更「邏輯導向」。

我的問題是,有沒有辦法做到這一點,如果沒有,那裏沒有一個,或者爲什麼我的方法在這裏錯了?

+0

它本來是有用的,但沒有任何速記可以做到這一點,因爲沒有人改變語言規範來提供它,然後實現它併發布它。請參閱Eric Lippert在此處對類似問題的回覆:http://stackoverflow.com/questions/2806894/why-c-sharp-doesnt-implement-indexed-properties – 2013-03-18 07:20:53

+0

您可以使用'crn'片段自動生成樣板這些非空的語句,這減少了鍵入。 – 2013-03-31 19:56:50

回答

1

我不同意,當你需要檢查某些東西是否還沒有初始化,或者沒有找到數據時,null非常有用,有時你會希望將null傳遞給方法,並且它的罰款,代碼合同對於服務大量類的常用方法和API定義都很有用。如果您在分層體系結構中編寫代碼,則只需要保護各個層之間的交互,並且在每個層內您都是無效的。

你的域名有空,而且沒關係。

+0

你誤解了他。他在問爲什麼沒有簡短的說一個參數不允許爲空。 – 2013-03-18 07:16:47

+0

「或者爲什麼我的方法在這裏出錯?」 – 2013-03-18 07:17:33

+1

對不起,我應該說的是:他問爲什麼默認情況下不允許空值,但用一個簡寫說一個參數*被允許爲空。他絕對是正確的,通常的情況是,不允許空值(至少,根據我的經驗)。 – 2013-03-18 07:20:14