2009-07-17 188 views

回答

1

沒有建成,但你可以看看「契約式設計」的概念,如(例如)LinFu實現。

+2

這也實現在C#4.0,在Visual Studio 2010測試版1 – 2009-07-17 12:36:42

+0

是如何從你的方法檢查參數是否爲空或不是,並拋出一個ArgumentNullException f.i. DBC不同當參數爲空時? – 2009-07-17 12:38:00

+0

在功能上,它不是真的。不過,從語法上來說,它通過使用適當的屬性對其進行裝飾,從而使方法的外部接口清晰。 – 2009-07-17 12:44:58

3

你不能,基本上是這樣。你也許可以使用AOP(例如PostSharp)通過屬性或4.0中的代碼合同(允許編譯時檢查)爲你做一些事情;但沒有「不可空的引用類型」(與「可空值類型」比較等)。同樣重要的是:字段將初始化爲什麼?什麼會默認(...)是?

已經有請求,包括在的langauge什麼來幫助(實際上爲你做的空檢查),但它並沒有發生。例如:

public void Foo (string! myRequiredString nullable) {...} 
1

在C#4.0中,您可以使用代碼合同:InfoQ: .NET 4 Feature Focus: Code Contracts

目前所有其他解決方案包括運行時代碼檢查。您可以使用AOP框架(例如PostSharp)將代碼注入方法中,但這一切都歸結爲方法中的代碼。

1

除了進入.NET ...的一些beta版本它們雖然令人興奮,是有風險的,並沒有真正回答你的問題。

現在不幸的是你能做的最好的事情就是添加智能感知評論你的代碼,警告不通過空值。

/// <summary> 
    /// This Foo method does Bar to something. 
    /// </summary> 
    /// <param name="myRequiredString">required, do NOT pass nulls. I really really mean it!</param> 
    public void Foo(String myRequiredString) 
    { 
     if (myRequiredString == null) 
     { 
      throw new ArgumentNullException("myRequiredString", "It said required in the name of the argument, dummy!"); 
     } 
    } 

有出有幾個hackish solutions,人們已經實現了一個通用的非空結構,但底線是你想要的是在Visual Studio不讓你鍵入「美孚(空)」,並警告如果你這樣做,或者給你一些編譯器錯誤,事實上99.99%的方法調用是不應該爲空的,那麼你將不得不執行== null檢查,並且無論如何拋出一個ArgumentNullException,因爲你直到運行時才知道參數爲空。即使您在C#中尋找的東西至少是編譯器將不得不添加空檢查並在其中拋出ArgumentNullException。

我想我說的是你要找的是什麼「語法糖」來保存你的手指有些運動。現在,如果您厭倦了打字,我建議您創建一個代碼片段。

0

我目前從事這方面工作在C#。對於值類型,.NET可以使用空值<T>,但是對於引用類型,反函數不存在。

我爲參考類型創建了NotNullable <T>,並將問題從if(不再檢查null)移至數據類型域。但是,這使應用程序在運行時拋出異常,而不是在編譯時拋出異常,但它對我仍然非常有用。