2012-11-16 47 views
3

我有相對經常的方法,我只想填充參數作爲輸入。如果有人調用該方法,並且參數不正確,則應該拋出錯誤。有沒有辦法在c#中註釋允許的值#

有沒有一種方法來註釋一個方法來說:只允許某些值範圍,或者它們應該不爲空?

隨着泛型有像「where」子句的限制(迄今還沒有價值)。

所以我想要做的,而不是

private static void DoSomething(string string_in, object object_in,...) 
{ 
    if (null == object_in) throw new NullReferenceException("Input parameter of object is empty."); 
    if (String.IsNullOrEmpty(string)) throw new NullReferenceException("Input parameter string is empty."); 

private static void DoSomething(string string_in, object object_in,...) 
    where string _in:!String.IsNullOrEmpty(string_in) 
    where object_in : object_in !=null 

private static void DoSomething(string string_in != null, object object_in != null,...) 

或(這也是我最喜歡的)

[Restriction string_in: value != null, value != empty] 
[Restriction object_in: value != null] 
[Restriction int_in: value inRange 3..9] 
private static void DoSomething(string string _in, object object_in,...) 

所以總之有沒有更好的方法來限制被調用的類型的一定數量的值,然後只是手動反覆比較一些東西?

+4

還有[代碼合同](http://msdn.microsoft.com/en-us/library/dd264808.aspx) – Giedrius

+0

謝謝,看起來很有希望(爲什麼它是一個評論,而不是一個答案?) – Offler

回答

1

代碼合約爲您的代碼提供靜態分析,因此它非常接近您的需求。 作爲獎勵,您還可以啓用運行時檢查。

msdn

代碼合同規定的方式指定的先決條件,後置條件,並在代碼中的對象不變。先決條件是在輸入方法或財產時必須滿足的要求。後置條件在方法或財產代碼退出時描述期望值。對象不變量描述處於良好狀態的類的預期狀態。

代碼合同包括標記你的代碼,靜態分析儀編譯時分析運行分析類。代碼合同的類可以在System.Diagnostics.Contracts命名空間中找到。

代碼合同的好處包括以下內容:

  • 改進測試:代碼協定提供靜態的合同 驗證,運行時檢查和文檔生成。

  • 自動測試工具:您可以使用代碼合約來生成更有意義的單元測試,方法是過濾掉不符合前提條件的無意義測試 參數。

  • 靜態驗證:靜態檢查器可以決定是否有任何違反合同而不運行程序。它檢查 隱式合約,如空解除引用和數組邊界, 和顯式合約。

  • 參考文檔:文檔生成器使用合同信息擴充現有的XML文檔文件。還有 也可以與Sandcastle一起使用的樣式表,以便 生成的文檔頁面包含合同部分。

+0

謝謝你,這就是我正在尋找的(不知道這個詞的搜索相當複雜) – Offler

0

不,因爲編譯器應該如何知道值是否爲空?您可以得到的最接近的是code contracts

+0

恕我直言:該編譯器可以做2件事:1.靜態檢查2.創建源代碼瑣碎檢查 – Offler

0

不,您需要記錄您的方法並在其中添加信息,或者您可以實現自定義屬性,但沒有編譯器會執行該屬性。另外,不要NullReferenceException。拋出一個ArgumentNullExceptionArgumentException。正如有些人所說,代碼合同可能會提供類似的東西。

+0

文件的方法沒有幫助。總會有人會誤導它。 – Offler

1

您可以將企業庫5.0中使用驗證應用程序塊。

+0

謝謝,經過很快的瞥見,似乎企業庫是用於輸入字段,我主要搜索接口。 (EL也很有趣) – Offler

相關問題