मुझे उदाहरण के लिए डेटा की कई वस्तुओं को संसाधित करना है
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) {
...
}
मेरा प्रश्न दिया गया है कि यू.फोन और इसी तरह यू.एड्रेस न्यूल हो सकता है मैं प्रत्येक प्रोसेसप्रॉपर्टी (...) कॉल को एक कोशिश/पकड़ ब्लॉक में डाले बिना "यूजर यू" ऑब्जेक्ट को कैसे संसाधित कर सकता हूं?
क्षमा करें यदि प्रश्न का स्वरूपण अच्छा नहीं है, तो मुझे अभी भी पोस्टिंग की हैंग हो रही है।
बहुत धन्यवाद। एन।
5 जवाब
आप कोशिश कर सकते हैं (शायद यह सुरुचिपूर्ण नहीं है):
ProcessProperty(u.Phone == null ? null : u.Phone.Work);
तथा
private void ProcessProperty(string data) {
if (String.IsNullOrEmpty(data)) {
....
} else {
....
}
}
यदि आप उपयोगकर्ता वर्ग को संपादित कर सकते हैं तो मैं गुणों पर सेट कोड बदल दूंगा जो NULL को स्ट्रिंग में बदलने के लिए शून्य हो सकता है। खाली
यदि आपके पास ProcessProperty फ़ंक्शन का नियंत्रण है तो आप इसे केवल फ़ंक्शन के अंदर जोड़ सकते हैं
if(data == null) return;
अन्यथा आप बस इसे लिख सकते हैं
if(u.Phone != null)
ProcessProperty(u.Phone.Work);
एक सन्यासी बनाने के लिए लैम्ब्डा एक्सप्रेशन और एक विस्तार विधि का उपयोग करें:
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
का उपयोग करता है, ताकि इसे और भी छोटा किया जा सके।
संदर्भ:
अगर आप 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;
}
}
संबंधित सवाल
नए सवाल
c#
C # (उच्चारण "तेज देखें") Microsoft द्वारा विकसित एक उच्च स्तरीय, सांख्यिकीय रूप से टाइप किया हुआ, बहु-प्रतिमान प्रोग्रामिंग भाषा है। C # कोड आमतौर पर Microsoft के .NET परिवार के टूल और रन-टाइम को लक्षित करता है, जिसमें .NET फ्रेमवर्क, .NET कोर और Xamarin अन्य शामिल हैं। C # या C # के औपचारिक विनिर्देश में लिखे गए कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें।