2012-12-04 13 views
10

मेरे पास समान कार्यक्षमता के लिए निम्नलिखित दो दृष्टिकोण हैं - एक "अगर" स्थिति के साथ और एक "?? और कास्टिंग "किस तरीके से बेहतर है क्यों"अगर" स्थिति से बेहतर है ?? और कास्टिंग

कोड:।?

Int16? reportID2 = null; 
    //Other code 

    //Approach 1 
    if (reportID2 == null) 
    { 
     command.Parameters.AddWithValue("@report_type_code", DBNull.Value); 
    } 
    else 
    { 
    command.Parameters.AddWithValue("@report_type_code", reportID2); 
    } 

    //Approach 2 
    command.Parameters.AddWithValue("@report_type_code", ((object) reportID2) ?? DBNull.Value); 

अद्यतन

जवाब के आधार पर निम्न ??

  1. वृद्धि पठनीयता के क्या लाभ हैं
  2. कार्यक्रम प्रवाह की कमी हुई शाखाओं की कमी (कम साइकिल omatic जटिलता)

नोट: वस्तु के रूप में कास्टिंग की लागत नगण्य है।

संदर्भ

  1. Null-Coallescing Operator - Why Casting?
+0

मैं 'null-col-op ',' performance' और' कास्टिंग' टैग छोड़ दूंगा। – abatishchev

उत्तर

4

मैं हमेशा इस तरह के मामलों में null-coalescing operator का उपयोग करें:

command.Parameters.AddWithValue("@name", value ?? DBNull.Value); 

command.ExecuteScalar() as int? ?? -1; 

आदि

यह कोड reada बढ़ जाती है द्विपक्षीयता, शाखा गहराई घट जाती है। विशेष रूप से डेटाबेस से संबंधित परिदृश्यों जैसे ADO.NET के लिए भी बनाया गया था।

+0

आपको ऐसा क्यों लगता है कि यह बेहतर है? – Lijo

+0

यह संकलन क्यों करता है? दोनों पक्षों पर असंगत प्रकारों के बारे में शिकायत नहीं करेंगे? – CodesInChaos

+0

@CodesInChaos: निश्चित रूप से, यह नहीं होगा। मैं बस बेहतर पठनीयता के लिए छोड़ दिया। – abatishchev

10

शून्य कोलेसिंग ऑपरेटर (??) एक बेहतर दृष्टिकोण है क्योंकि यह आपके प्रारंभिक ब्लॉक के समान ही है, लेकिन एक ही, पढ़ने में आसान लाइन है। यह कोड को और अधिक पढ़ने योग्य और अधिक रखरखाव बनाता है।

यह वाक्य रचनात्मक चीनी के कई उदाहरणों में से एक है, जो सामान्य रूप से उपयोग किए जाने वाले विचार का प्रतिनिधित्व करने के लिए कोड शॉर्ट्स "शॉर्टकट" कहता है। i++ इसका एक और उदाहरण है, क्योंकि यह i = i + 1 को प्रतिस्थापित करता है। यह ?? की तरह, क्लीनर और सरल है।

+1

क्षमा करें, लेकिन आप गलत हैं, एक स्विच एक जंप टेबल है यदि कोई आसान नहीं है! यही कारण है कि केवल सरल मूल्यों की अनुमति है। –

+5

@ फ़ेलिक्सके .: 4 से कम स्विच-केस के लिए - यह केवल तभी होता है (अन्यथा (कंपाइलर द्वारा अनचाहे) – abatishchev

+3

@ फ़ेलिक्सके। आईएमओ जो सिर्फ एक कार्यान्वयन विस्तार है। कंपाइलर को एक 'कूद' में एकाधिक 'if' चालू करने की अनुमति है, और एकाधिक 'if' में स्विच किया जाता है। – CodesInChaos

2

आपके उदाहरण में, दृष्टिकोण 2 बेहतर है। आप should not repeat yourself, और apprach 1 में कोड और पैरामीटर नाम दो बार है। यदि आप पैरामीटर नाम बदलना चाहते हैं, तो आपको दो स्थानों पर ऐसा करना चाहिए, और यह एक परेशानी है।

वास्तविक कोड तुलना करने के लिए यह इस है:

object value = DBNull.Value; 
if (reportID2 != null) 
{ 
    value = reportID2; 
} 
command.Parameters.AddWithValue("@report_type_code", value); 

आप का उपयोग इस या ?? ऑपरेटर व्यक्तिगत पसंद की बात है। मुझे लगता है कि if अधिक स्पष्ट है, खासकर क्योंकि आपको कोलेसे ऑपरेटर के मामले में ब्रांड्स और कास्टिंग की आवश्यकता है।

+0

प्रदर्शन-वार जो बेहतर है? दृष्टिकोण 1 या दृष्टिकोण 2? – Lijo

+4

नहीं। आपको इस मामले में प्रदर्शन के बारे में चिंता नहीं करनी चाहिए। अंतर नगण्य है। – Sjoerd

+0

यदि आप सहमत हैं तो आप निम्नलिखित विवरणों के साथ अपना उत्तर सुधार सकते हैं? 1) दृष्टिकोण 2 अधिक पठनीय है 2) AddWithValue हमेशा ऑब्जेक्ट के रूप में मुक्केबाजी का कारण बनता है 3) ऑब्जेक्ट पर कास्टिंग महंगा नहीं है। – Lijo

0

मैं ?? ऑपरेटर पसंद करूंगा। हालांकि ब्रेवटी हमेशा बेहतर पठनीयता की ओर ले जाती है, इस मामले में ऐसा इसलिए होता है क्योंकि एक पाठक के रूप में आपको if और else की दो पंक्तियों के बीच समानता की तुलना करने की आवश्यकता नहीं होती है। इसके अलावा, आपने कोड के डुप्लिकेशन को हटा दिया (जो हमेशा अच्छा होता है!)। उस मामले पर विचार करें जब आप अपना डेटाबेस फ़ील्ड नाम @report_type_code का नाम बदलते हैं।फिर आपको केवल एक ही स्थान पर इसे बदलना होगा।

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