2010-06-07 13 views
6

C# 4, nie jest skrótem dla sprawdzania wartości zerowych tak:C# 4: jak wykrywanie w linii dla wartości zerowych?

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

Wartość powróci traci nie rzucać wyjątek.

Ktoś ma link do tego, jak z niego korzystać lub przynajmniej jego składnia?

+0

Podobne http://stackoverflow.com/questions/2929836 –

Odpowiedz

9

Ten operator nazywa się safe navigation operator w Groovy.

To nie jest dostępny w języku C# jeszcze, nawet w C# 4.

Jeśli wystarczająco dużo ludzi, pokazać swoje poparcie dla niego, być może będzie to dostać się do hipotetycznego przyszłej wersji C# ...

+0

Myślę, że to jeden z nowych funkcji w C# 6 http://msdn.microsoft.com/en-us/magazine/dn802602.aspx – user65439

1

W C#/C++, mogę to osiągnąć za pomocą potrójnego operatora, chociaż kod byłby ohydny. Czy na pewno chcesz tego użyć?

if ((myObject = null (myobject.myproperty = null (myobject.myproperty.myotherproperty = null myobject.myproperty.myotherproperty.value:!?!?!? Null): null): null) = NULL)

class MyOtherProperty 
{ 
    public string value; 
} 

class MyProperty 
{ 
    public MyOtherProperty myotherproperty; 
} 

class MyObject 
{ 
    public MyProperty myproperty; 
} 

moja jednostka kodu testu:

[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

Jestem starym uniksem i c facetem, więc tak naprawdę wolę takie podejście od if (this == null) then if (ThisOtherThing == null) itp. –

2

Jak mówili inni, nie ma wbudowanego w sposób to zrobić w C# jest. Kilka miesięcy temu napisałem blog post o sposób, aby to zrobić za pomocą wyrażeń, z metody NullSafeEval rozszerzenie:

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

Ale to tylko dowód koncepcji, nie przetestować go dokładnie, i to całkiem powolny ...

2

W języku C# jest również? operator, który jest używany do testowania przeciwko zeru. To jest nieco lepsze niż? operator.

(x ?? -1) jest równoznaczne z (x = null x:! -1)

+0

znany również jako "Null coalescing operator". jedno z rzadko używanych słów kluczowych. – Syd

Powiązane problemy