मुझे उदाहरण के लिए डेटा की कई वस्तुओं को संसाधित करना है

User u = NotMyObject.GetUser(100);
ProcessProperty(u.FirstName);
ProcessProperty(u.Surname);
ProcessProperty(u.Phone.Work);
ProcessProperty(u.Phone.Mobile);
...
ProcessProperty(u.Address.PostCode);

इसे लें कि सभी गुण GetUser (...) से स्ट्रिंग के रूप में वापस कर दिए जाते हैं। प्रोसेसप्रॉपर्टी क्या करता है, मुझे उम्मीद है, प्रासंगिक नहीं है (उदाहरण के लिए, फ़ाइल में मान लिख सकते हैं) लेकिन यह ऐसा दिखेगा:

private void ProcessProperty(string data) {
...
}

मेरा प्रश्न दिया गया है कि यू.फोन और इसी तरह यू.एड्रेस न्यूल हो सकता है मैं प्रत्येक प्रोसेसप्रॉपर्टी (...) कॉल को एक कोशिश/पकड़ ब्लॉक में डाले बिना "यूजर यू" ऑब्जेक्ट को कैसे संसाधित कर सकता हूं?

क्षमा करें यदि प्रश्न का स्वरूपण अच्छा नहीं है, तो मुझे अभी भी पोस्टिंग की हैंग हो रही है।

बहुत धन्यवाद। एन।

0
ninety 12 अक्टूबर 2011, 15:04

5 जवाब

सबसे बढ़िया उत्तर

आप कोशिश कर सकते हैं (शायद यह सुरुचिपूर्ण नहीं है):

ProcessProperty(u.Phone == null ? null : u.Phone.Work);

तथा

private void ProcessProperty(string data) {
    if (String.IsNullOrEmpty(data)) {
        ....
    } else {
        ....
    }
}
1
Marco 12 अक्टूबर 2011, 15:10

यदि आप उपयोगकर्ता वर्ग को संपादित कर सकते हैं तो मैं गुणों पर सेट कोड बदल दूंगा जो NULL को स्ट्रिंग में बदलने के लिए शून्य हो सकता है। खाली

0
Purplegoldfish 12 अक्टूबर 2011, 15:11

यदि आपके पास ProcessProperty फ़ंक्शन का नियंत्रण है तो आप इसे केवल फ़ंक्शन के अंदर जोड़ सकते हैं

if(data == null) return;

अन्यथा आप बस इसे लिख सकते हैं

if(u.Phone != null)
     ProcessProperty(u.Phone.Work);
0
Udrian 12 अक्टूबर 2011, 15:12

एक सन्यासी बनाने के लिए लैम्ब्डा एक्सप्रेशन और एक विस्तार विधि का उपयोग करें:

public static class ObjectExt
{
    public static TProp GetPropOrNull<TObj, TProp>(this TObj obj, 
        Func<User,TProp> getProp)
        where TObj : class
        where TProp : class
    {
        if (obj == null)
            return null;
        else
            return getProp(obj);
    }
}

उपयोग:

u.GetPropOrNull(obj => obj.Phone).GetPropOrNull(obj => obj.Work);
u.GetPropOrNull(obj => obj.Phone).GetPropOrNull(obj => obj.Home);

एक लंबी डॉट श्रृंखला (जैसे u.Phone.Work.Whatever) का उपयोग करने के बजाय, जो विफल हो जाती है यदि पहली संपत्ति में से कोई भी शून्य है, तो यह विधि शॉर्ट-सर्किट और शून्य देखते ही शून्य हो जाती है। यह आपके कोड को काफी हद तक छोटा कर सकता है (अगर-चेक का उपयोग करने के विपरीत) यदि आपको किसी और की कक्षा में गहराई से संपत्ति के साथ काम करना है जो शायद बहुत सावधान प्रोग्रामर नहीं है। मुझे लगता है कि नीचे दिए गए लेख में, लेखक GetPropOrNull के बजाय विधि नाम With का उपयोग करता है, ताकि इसे और भी छोटा किया जा सके।

संदर्भ:

0
FishBasketGordo 12 अक्टूबर 2011, 15:23

अगर आप ProcessProperty को बदल नहीं सकते, तो इसे लपेटने पर विचार करें:

private void ProcessPropertySafe(string data) 
{
    if (data != null)
    {
        ProcessProperty(data);
    }
}

या इसे int.Parse() बनाम int.TryParse() की तरह करें:

private bool TryProcessProperty(string data) 
{
    try
    {
        ProcessProperty(data);
        return true;
    }
    catch // <- That's not clean ...
    {
        return false;
    }
}
0
Oli 12 अक्टूबर 2011, 15:30