2010-06-07 17 views
6

Trong C# 4, đã không có một cắt ngắn để kiểm tra cho các giá trị null như vậy:C# 4: làm thế nào để phát hiện trong dòng cho null?

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

Giá trị sẽ trả về null và không ném một ngoại lệ.

Bất kỳ ai có liên kết đến cách sử dụng hoặc ít nhất cú pháp?

+0

liên quan http://stackoverflow.com/questions/2929836 –

Trả lời

9

Toán tử này được gọi là safe navigation operator trong Groovy.

Nó không phải là có sẵn trong C# nào, thậm chí không bằng C# 4.

Nếu đủ người hiện sự ủng hộ của họ đối với nó, có lẽ nó sẽ nhận được vào một phiên bản giả tương lai của C# ...

+0

Tôi nghĩ rằng đây là một trong những tính năng mới trong C# 6 http://msdn.microsoft.com/en-us/magazine/dn802602.aspx – user65439

1

Trong C#/C++, tôi có thể đạt được điều này bằng cách sử dụng toán tử ternary mặc dù mã sẽ là ẩn. Bạn có chắc chắn muốn sử dụng điều này không?

if ((myObject = null (myobject.myproperty = null (myobject.myproperty.myotherproperty = null myobject.myproperty.myotherproperty.value:!?!?!? Null): null): null) = rỗng)

class MyOtherProperty 
{ 
    public string value; 
} 

class MyProperty 
{ 
    public MyOtherProperty myotherproperty; 
} 

class MyObject 
{ 
    public MyProperty myproperty; 
} 

Unit My mã kiểm tra:

[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

Tôi là một unix cũ và c guy, vì vậy tôi thực sự thích cách tiếp cận này hơn nếu (điều này == null) sau đó nếu (thisOtherThing == null), v.v. –

2

Như những người khác đã nói, không có xây dựng theo cách để làm điều đó trong C#. Một vài tháng trước, tôi đã viết một blog post về một cách để làm điều đó bằng biểu thức, với một phương pháp NullSafeEval mở rộng:

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

Nhưng nó chỉ là một bằng chứng của khái niệm, tôi không kiểm tra nó kỹ lưỡng, và nó khá chậm ...

2

Trong C# cũng có ?? toán tử được sử dụng để thử nghiệm với null. Điều này là tốt hơn một chút so với? nhà điều hành.

(x ?? -1) tương đương với (x = null x:!? -1)

+0

còn được gọi là "toán tử kết hợp Null". một trong số ít từ khóa được sử dụng. – Syd

Các vấn đề liên quan