2010-06-07 45 views
6

在C#4,是不存在的,像這樣檢查空值的捷徑:C#4:如何在線檢測空值?

if(myobject?.myproperty?.myotherproperty?.value != null) 

的值將返回null,而不是拋出異常。

任何人都有鏈接到如何使用它或至少是語法?

+0

相關http://stackoverflow.com/questions/2929836 – 2010-06-07 21:36:52

回答

9

該操作符在Groovy中被稱爲safe navigation operator

這是不是在C#產品尚未推出,甚至沒有在C#4

如果有足夠多的人展示自己對它的支持,也許它會進入C#的一個假想的未來版本...

+0

我認爲這是一個新特性在c#6 http://msdn.microsoft.com/en-us/magazine/dn802602.aspx – user65439 2014-12-09 13:18:05

1

在C#/ C++,我可以使用三元運算符來實現這一點,儘管代碼很可怕。你確定要使用這個嗎?

如果((MYOBJECT = NULL(myobject.myproperty = NULL(myobject.myproperty.myotherproperty = NULL myobject.myproperty.myotherproperty.value:!?!?!?NULL):空):空)=空)

class MyOtherProperty 
{ 
    public string value; 
} 

class MyProperty 
{ 
    public MyOtherProperty myotherproperty; 
} 

class MyObject 
{ 
    public MyProperty myproperty; 
} 

我的單元測試代碼:

[TestMethod()] 
    public void TestTernaryOperator() 
    { 
     MyObject myobject = new MyObject(); 
     Debug.WriteLine (string.Format ("{0}, {1}", myobject != null, myobject.myproperty != null)); 
     Debug.WriteLine(string.Format("IsNotNull = {0}", IsNotNull(myobject))); 
     myobject.myproperty = new MyProperty(); 
     Debug.WriteLine (string.Format ("{0}, {1}, {2}", myobject != null, myobject.myproperty != null, myobject.myproperty.myotherproperty != null)); 
     Debug.WriteLine(string.Format("IsNotNull = {0}", IsNotNull(myobject))); 
     myobject.myproperty.myotherproperty = new MyOtherProperty(); 
     Debug.WriteLine (string.Format ("{0}, {1}, {2}, {3}", myobject != null, myobject.myproperty != null, myobject.myproperty.myotherproperty != null, myobject.myproperty.myotherproperty.value != null)); 
     Debug.WriteLine(string.Format("IsNotNull = {0}", IsNotNull(myobject))); 
     myobject.myproperty.myotherproperty.value = "Hello world"; 
     Debug.WriteLine(string.Format("{0}, {1}, {2}, {3}", myobject != null, myobject.myproperty != null, myobject.myproperty.myotherproperty != null, myobject.myproperty.myotherproperty.value != null)); 
     Debug.WriteLine(string.Format("IsNotNull = {0}", IsNotNull(myobject))); 

    } 

    bool IsNotNull(MyObject myobject) 
    { 
     bool isNotNull = (myobject != null ? (myobject.myproperty != null ? (myobject.myproperty.myotherproperty != null ? myobject.myproperty.myotherproperty.value : null) : null) : null) != null; 
     return isNotNull; 
    } 
+0

我是一箇舊的unix和c的傢伙,所以我實際上更喜歡這種方法if(this == null)then if thisOtherThing == null)等。 – 2010-06-07 23:08:20

2

正如其他人所說,沒有內置的方法做它在C#。幾個月前,我寫了一個blog post約的方式使用表達式來做到這一點,有NullSafeEval擴展方法:

if (myobject.NullSafeEval(o => o.myproperty.myotherproperty.value) != null) 
... 

但它只是一個概念證明,我沒有測試它徹底,這是相當慢...

2

在C#中還有??運算符用於測試null。這比稍微好點?運營商。

(X ?? -1)等價於(X = NULL X!?-1)

+0

也被稱爲「空合併運算符」。其中一個很少使用的關鍵字。 – Syd 2010-06-07 23:14:12