2014-06-25 39 views
2

有沒有辦法在c#中進行通用級聯空引用檢查?級聯空引用異常檢查?

什麼,我想實現的是,如果我試圖訪問一個字符串變量是C類,這是inturn在B類,這是A.

ABCstr

的一部分

而且我通過A,我將不得不檢查A是否爲空,然後檢查B是否爲空,然後檢查C是否爲空,然後訪問str。

是否有可能有一些方法 - 我們可以傳入,A和A.B.C.str並返回null如果所有東西都正確存在,那麼任何東西都是null或str的值。

+4

我聞得墨忒耳定律違規。 –

+0

我在這裏做了一些令人討厭的事情:http://stackoverflow.com/questions/17657942/nice-way-to-avoid-null-checks-in-ifs – rene

+0

@rene:在很多方面都是如此錯誤。我想我喜歡它。 –

回答

3

有沒有內置在C#中的可能性,但你可以使用這樣的事情http://www.codeproject.com/Articles/109026/Chained-null-checks-and-the-Maybe-monad

它涉及聲明正是如此功能:

public static TResult With<TInput, TResult>(this TInput o, 
     Func<TInput, TResult> evaluator) 
     where TResult : class where TInput : class 
{ 
    if (o == null) return null; 
    return evaluator(o); 
} 

然後你可以這樣調用:

string postCode = this.With(x => person) 
         .With(x => x.Address) 
         .With(x => x.PostCode); 
+1

FTFY .......... http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere- really-good-answers –

6

有沒有內置的方式來做到這一點,但在C#6.0中,我們期待一個'安全導航'操作符,請參閱this post by Jerry Nixon

它會是這個樣子:

var g1 = parent?.child?.child?.child; 
if (g1 != null) // TODO 
+0

FTFY .......... http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers –

+2

正是我今天所希望的:)這真棒..不能等待c#6然後!!! – MoXplod

+0

相同。檢查每個級別的舊方法仍然會被廣泛使用,原因很明顯,但它肯定會清除部分代碼。然而,在尼克松的帖子中,它並沒有確切地說這是否在6.0以內。 – GEEF