2010-02-24 9 views
7

हर कोई कोलेसे ऑपरेटर समेत कम से कम दो सामान्य सी # मुहावरे जानता है:आम सी # मुहावरे सहित सहवास ?? ऑपरेटर

एक सिंगलटन एक:

return _staticField = _staticField ?? new SingletonConstructor(); 

और एक श्रृंखला एक:

notNullableResult = nullable1 ?? nullable2 ?? nullable3 ?? default(someType); 

यह पढ़ने योग्य, सुसंगत, उपयोग करने योग्य और पहचानने योग्य है कोड।

लेकिन, दुर्भाग्यवश, यह सब कुछ है। कभी-कभी इसे विस्तार या बदलने की आवश्यकता होगी। कभी-कभी जब मैं एक विशेष मामला देखता हूं तो मैं उनका उपयोग करता हूं - और हमेशा मैं इसका उपयोग करने में संकोच करता हूं क्योंकि मुझे नहीं पता कि कोई अन्य प्रोग्रामर वास्तव में इसे आसान पढ़ेगा या नहीं।

क्या आप किसी और को जानते हैं? मुझे अधिक विशिष्ट उपयोग करना अच्छा लगेगा: उदा। एएसपीनेट, ईएफ, LINQ, कुछ भी - जहां coalesce केवल स्वीकार्य लेकिन उल्लेखनीय नहीं है।

+1

मुझे ऐसा लगता है कि रिक्त कोलेसिंग ऑपरेटर के सभी उपयोगों अपने में से केवल विशेष मामलों रहे हैं " श्रृंखला एक "। –

+0

अभी भी, सभी मामले कम या ज्यादा विशेष या सामान्य हैं। मेरे लिए, प्रोग्रामिंग की कला अंतर को संतुलित और महसूस करना है। कोलेसस 'if' कथन का एक विशेष मामला है, है ना? और स्विच - केस एक विशेष है, तो क्या - उन्हें हटाने के लिए? – rudnev

+1

ऐसा नहीं है कि आप आलसी-तत्काल सिंगलटन को कैसे कार्यान्वित करते हैं। भले ही आपने इस प्रश्न में अल्पसंख्यक के लिए 'लॉक' ब्लॉक छोड़ा हो, फिर भी यह केवल कोड को खराब करने में काम करता है। – Aaronaught

उत्तर

6

मेरे लिए, जहां यह एसक्यूएल करने के लिए अनुवाद अपने आप में काफी अच्छा है:

from a in DB.Table 
select new { 
      a.Id, 
      Val = a.One ?? a.Two ??a.Three 
      } 

इस डेटाबेस तरफ COALSCE में जिसके परिणामस्वरूप ज्यादातर मामलों में काफी क्लीनर एसक्यूएल के लिए बनाता है, वहाँ तो बस किसी भी नहीं है महान विकल्प। हम ओरेकल का उपयोग कर रहे हैं, मैं पढ़ना नहीं चाहूंगा हालांकि Nvl(Nvl(Nvl(Nvl( घोंसला धन्यवाद ... मैं अपना COALSCE ले जाऊंगा और इसके साथ चलूंगा।

मैं भी इस तरह की संपत्तियों के लिए इसका इस्तेमाल करते हैं, बस व्यक्तिगत स्वाद मुझे लगता है:

private string _str; 
public string Str { 
    get { return _str ?? (_str = LoaderThingyMethod()); } 
} 
4

कारण यह है कि अशक्त-कोलेसिंग ऑपरेटर में शुरू किया गया है सी # 2.0 के लिए डिफ़ॉल्ट मान आवंटित करने के लिए एक रास्ता है करने के लिए था nullable types और इस तरह आसानी से एक शून्य प्रकार को एक गैर-शून्य प्रकार में परिवर्तित करें। ?? के बिना किसी भी रूपांतरण के लिए लंबे if कथन की आवश्यकता होगी।

एक नल प्रकार एक मूल्य के शामिल कर सकते हैं, या यह अपरिभाषित जा सकता है: निम्नलिखित उद्धरण MSDN से लिया जाता है। ?? ऑपरेटर डिफ़ॉल्ट मान को पर वापस कर देता है जब एक शून्य प्रकार गैर-शून्य प्रकार के लिए असाइन किया जाता है। यदि आप एक शून्य मूल्य असाइन करने के लिए एक गैर-शून्य मूल्य प्रकार को बिना किसी प्रयोग के असाइन करने का प्रयास करते हैं ?? ऑपरेटर, आप संकलन-समय त्रुटि उत्पन्न करेंगे। यदि आप एक कास्ट का उपयोग करते हैं, और शून्य मूल्य प्रकार वर्तमान में अपरिभाषित है, अमान्यऑपरेशन अपवाद अपवाद फेंक दिया जाएगा।

आप निम्न सरलीकरण पर विचार हो सकता "उल्लेखनीय":

int? x = null; 
int y = x ?? -1; 
के बजाय

int? x = null; 
int y = -1; 

if (x.HasValue) 
{ 
    y = x.Value; 
} 
+0

हां, मुझे यह निर्दिष्ट करना चाहिए था कि एक श्रृंखला आमतौर पर नलिकाओं के बारे में होती है। धन्यवाद। – rudnev

+0

नल कोलेसिंग ऑपरेटर वास्तव में सी # 2.0 में शुरू किया गया था, 3.0 नहीं (शून्य प्रकार के समान) –

+0

@ थॉमस लेवेस्क: आप सही हैं, मैं सही हूं। –

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