2010-10-09 9 views
6

संभावित डुप्लिकेट यदि:कई से बचने के लिए कैसे अशक्त चेकों

p.OrganisationalUnit.Parent.Head.CurrentAllocation.Person; 
:

Deep Null checking, is there a better way?
C# elegant way to check if a property's property is null

मैं इस तरह एक गहरी ऑब्जेक्ट मॉडल में एक देखने क्या करना है

वैसे भी इसे निकालने के लिए वैसे भी है और अगर कोई ओ च श्रृंखला एक

if (p.org == null && p.org.Parent == null && p.org.Parent.Head . . .  
+0

उस तरह के लुकअप से बचने की कोशिश करें; विवरण के लिए कृपया मेरा उत्तर नीचे देखें। – CesarGon

उत्तर

8

आप अशक्त-सुरक्षित भिन्नता ऑपरेटर ?. लिए देख रहे हैं करने के लिए बिना अशक्त (ऑरगेनाइजेशनलयूनिट, माता पिता, सिर, आदि), (भी सुरक्षित नेविगेशन के रूप में जाना जाता है) है कि कुछ भाषाएँ (जैसे ग्रोवी) है, लेकिन दुर्भाग्य से सी # में यह ऑपरेटर नहीं है।

एक दिन उम्मीद है कि यह लागू किया जाएगा ....

एरिक Lippert द्वारा भी this post देखें। वह वाक्यविन्यास प्रस्तावित करता है .? है।

+0

इसे अक्सर # नल प्रोपेगेटिंग ऑपरेटर ** या ** शून्य सशर्त ऑपरेटर ** कहा जाता है। –

+1

अब यह सी # 6 पर उपलब्ध है: https://msdn.microsoft.com/en-us/library/dn986595.aspx –

7

क्या आपने Law of Demeter के बारे में सुना है?

कॉल के ऐसे लंबे अनुक्रमों को चेन करना एक अच्छा विचार नहीं है। यह उन वर्गों के बीच भयानक निर्भरता बनाता है जिनकी आपको आवश्यकता नहीं है।

आपके उदाहरण में, p वाली कक्षा पांच अन्य कक्षाओं पर निर्भर हो जाती है। मेरा सुझाव है कि आप अपने कोड को सरल बनाएं और ज्ञान के अपने संदर्भ में, प्रत्येक वर्ग को एक स्तर पर नल के लिए जांचें।

+0

सहमत हैं लेकिन एक बड़े कोड बेस पर लिया गया है, इसे एक दिन में सभी को दोबारा नहीं कर सकता :) – leora

+0

@ooo: मैं समझता हूँ। उस स्थिति में, मुझे लगता है कि आपको नल चेक की बदसूरत श्रृंखला का उपयोग करने की आवश्यकता है। मैं इसे एक निजी विधि में encapsulate करने की कोशिश करता हूं ताकि निर्भरता अलग और आसानी से पहचाने जा सकें। – CesarGon

0

अपने शीर्षक में सवाल का जवाब करने के लिए, आप 'Demeter के कानून' लागू करने और()

एक विधि GetHeadOfParentOrganizationalUnit कहा जाता है मुझे यकीन है कि समाधान अपने विशिष्ट मामले के लिए लागू होता है अगर नहीं कर रहा हूँ बनाने के द्वारा से बच सकते हैं, लेकिन यह देखने के लायक है कि क्या आप उन सभी शून्य जांच को खत्म कर सकते हैं। बाहर a link

+1

लेकिन फिर फ़ंक्शन GetHeadofParent। ।केवल उसी नेस्टेड नल चेक – leora

+1

@oooo होगा - वास्तव में आप एक समय में एक स्तर पर कदम नहीं उठाते हैं। प्रत्येक वर्ग केवल अपने तत्काल सहयोगी से बात करता है, आप कुछ घोंसला वाले राज्य को फाड़ने के लिए सहयोगी को आंतरिक रूप से दूर नहीं करते हैं ... * डेमेटर * के कानून पर पढ़ते हैं। विकिपीडिया से - डेमेटर के कानून का नुकसान यह है कि कभी-कभी घटकों को विधि कॉल प्रसारित करने के लिए इसे बड़ी संख्या में छोटे "रैपर" विधियों को लिखने की आवश्यकता होती है। इसके अलावा, एक वर्ग का इंटरफ़ेस भारी हो सकता है क्योंकि यह निहित कक्षाओं के लिए विधियों का आयोजन करता है, जिसके परिणामस्वरूप एक समेकित इंटरफ़ेस के बिना कक्षा होती है। लेकिन यह भी खराब ओओ डिजाइन का संकेत हो सकता है। – Gishu

6

चेक this article:

भी देखें।

p.With(x => x.OrganisationalUnit) 
.With(x => x.Parent) 
.With(x => x.Head) 
.With(x => x.CurrentAllocation 
.With(x => x.Person); 
-2

आपको लगता है कि पकड़ने के लिए और साथ ही बुनियादी अपवाद हैंडलिंग का उपयोग कर सकते हैं: यह एक महान समाधान है कि आप उस तरह बातें लिखने के लिए अनुमति देता है प्रस्तुत करता है। मैं उस समाधान के बारे में पागल नहीं हूँ, लेकिन यह एक विकल्प है। यदि ये नेस्टेड नल सामान्य ऑपरेशन हैं, तो अपवाद शायद सही उत्तर नहीं हैं:

public class A 
{ 
} 
public class B 
{ 
    public A a; 
} 
public class C 
{ 
    public B b; 
} 
class Program 
{ 
    static A GetA(C c) 
    { 
     A myA; 
     try 
     { 
      myA = c.b.a; 
     } 
     catch 
     { 
      myA = null; 
     } 
     return myA; 
    }   

    static void Main(string[] args) 
    { 
     C theC = new C(); 
     theC.b = new B(); 
     theC.b.a = new A(); 
     A goodA = GetA(theC); 
     if (goodA != null) 
     { 
      Console.WriteLine("Expected nominal path."); 
     } 
     else 
     { 
      Console.WriteLine("Unexpected nominal path."); 
     } 
     theC.b.a = null; 
     A badA = GetA(theC); 
     if (badA == null) 
     { 
      Console.WriteLine("Expected off-nominal path."); 
     } 
     else 
     { 
      Console.WriteLine("Unexpected off-nominal path."); 
     } 

    } 

} 
+0

अपवाद हैंडलिंग सिस्टम का आह्वान सामान्य संचालन के लिए अत्यधिक लगता है; हालांकि आपने कहा कि यह एक समाधान है, बॉक्स के बाहर सोच रहा है। –

+0

@ जॉन के: मैं सहमत हूं - एकमात्र तरीका मैं वास्तव में इस पर विचार करता हूं कि अगर कोई नेस्टेड नल एक "टूटा हुआ" राज्य का प्रतिनिधित्व करता है। इसके अलावा यह जानने की समस्या नहीं है कि किस अव्यवस्था ने सिस्टम को तोड़ दिया, और प्रदर्शन मारा। लेकिन यह बॉक्स में एक उपकरण है ... – PatrickV

संबंधित मुद्दे