सी # तरीकों में रिटर्न वैरिएबल की घोषणा करना बनाम सीधे मूल्य वापस करना


17

रिटर्न चर के संबंध में एक बहस में, टीम के कुछ सदस्य सीधे कॉलर को परिणाम वापस करने के लिए एक विधि पसंद करते हैं, जबकि अन्य लोग रिटर्न चर घोषित करना पसंद करते हैं जो फिर कॉल करने वाले को वापस कर दिया जाता है (नीचे कोड उदाहरण देखें)

उत्तरार्द्ध के लिए तर्क यह है कि यह एक डेवलपर को कोड की डिबगिंग करने की अनुमति देता है जिससे कॉल करने वाले को लौटने से पहले विधि का रिटर्न मान मिल सके जिससे कोड को समझना आसान हो जाता है: यह विशेष रूप से सच है जहां विधि कॉल डेज़ी-जंजीर हैं।

क्या कोई दिशानिर्देश हैं, जो सबसे अधिक कुशल हैं और / या क्या कोई अन्य कारण है कि हमें एक शैली को दूसरे पर अपनाना चाहिए?

धन्यवाद

    private bool Is2(int a)
    {
        return a == 2;
    }

    private bool Is3(int a)
    {
        var result = a == 3;
        return result;
    }

11
दोनों उदाहरण समान IL को संकलित करेंगे। एकमात्र कारण जो आप चाहते हैं दूसरा उदाहरण डीबगिंग उद्देश्यों के लिए है या यदि आपको resultइसे वापस करने से पहले उपयोग करने की आवश्यकता है।
ChrisF

1
एक और कारण यह होगा कि आपको परिणाम की गणना और इसे वापस करने के बीच कुछ और करने की आवश्यकता है।
tdammers

1
@ क्रिस, वास्तव में वे मेरे लिए एक ही आईएल के लिए संकलन नहीं है (वहाँ अतिरिक्त stloc.0और ldloc.0दूसरे संस्करण में है)। लेकिन मुझे लगता है कि यह केवल डिबग मोड में होता है। और यह वास्तव में यहाँ वैसे भी महत्वपूर्ण नहीं है।
12

); @svick - - ठीक है मैं "को रिलीज़ मोड में" जोड़ा जाना चाहिए था
ChrisF

1
चूँकि आप कर सकते हैं और कभी-कभी (संक्षिप्तता के लिए) कुछ ऐसा लिखना चाहिए जो दिखता है: a = b = c;और a == b == c, मैं ऐसा कुछ लिखने से बचूंगा जो ऐसा लगता है जैसे a = b == cआप कर सकते हैं। जब मैंने पहली बार कोड की एक पंक्ति को देखा, तो मुझे यह पता लगाने में कुछ सेकंड लगे कि क्या चल रहा है। वह कोड बाहर खड़ा था। मैं चारों ओर कोष्ठक को थप्पड़ मारना चाहूंगा a == 3, लेकिन स्टाइलकॉप इसे पसंद नहीं करता है - संस्करण संख्या एक का उपयोग करने का एक अच्छा कारण। कुछ और: यह अनिवार्य रूप से एक मेमना है, जैसे कि a => (a == 3)। कोड की एक पंक्ति को पहले से ही तुच्छ तुच्छ फ़ंक्शन में क्यों जोड़ें?
नौकरी

जवाबों:


7

क्योंकि मैं Visual Studio के साथ Resharper का उपयोग करता हूं, Ctrl-RV (या Ctrl-Alt-V, यदि आप Resharper / IntelliJ कुंजी बाइंडिंग का उपयोग करते हैं) तो आपका पहला उदाहरण आपके दूसरे उदाहरण में बदल जाता है। इसलिए जब मैं डिबग करना चाहता हूं, तो मैं आसानी से पर्याप्त कर सकता हूं। और अगर मैं इसे वापस रखना भूल जाता हूं तो मुझे बुरा नहीं लगेगा क्योंकि Ctrl-RI इसे फिर से पढ़ने के लिए आसान बनाने के लिए फिर से वापस रख देगा।

गंभीरता से, अधिक महत्वपूर्ण चीजों के बारे में बहस करते हुए अपना समय बर्बाद करें। जहां अपने प्रमुख ब्रेसिज़ या रिक्त स्थान बनाम टैब लगाने के लिए।


5
मैं अपनी बहस को अदृश्य पात्रों के बारे में पसंद करता हूं ...
ChaosPandion

महान टिप, दोस्तों! अब हम एक-दूसरे के कोड को लगातार पहले की तुलना में कहीं अधिक तेजी से पुन: कारक बना सकते हैं। यह शायद वास्तव में चर्चा करने की तुलना में अधिक समय बचाएगा! :)
pb01

@ pdr करता है कि ctrl + RV केवल रेस्परर के साथ काम करता है? या यह कस्टम कीबाइंड के कुछ प्रकार है? यह मेरे लिए काम नहीं करता है।
जेन डो

@JaneDoe: मैं यह जानकर स्तब्ध हूं कि यह एक रिस्पेन्सर रीफैक्टरिंग है और वीएस के पास इसके समकक्ष नहीं है। उत्तर सही किया गया। उसके लिए माफ़ करना।
pdr

जीत के लिए @ChaosPandion U + 200B!
जेसी सी। स्लीकर

20

व्यक्तिगत रूप से मुझे पहला उदाहरण पढ़ने में आसान लगता है। आप अभी भी इसे डीबग कर सकते हैं, रिटर्न स्टेटमेंट में ब्रेक पॉइंट सेट करके और a == 2वॉच विंडो में जोड़कर या क्विक वॉच का उपयोग करके।

लेकिन यह वास्तव में व्यक्तिगत प्राथमिकता का मामला है। दोनों संस्करण ठीक हैं।


8
+1 को ब्रेकिंग पॉइंट्स को आसान बनाने के लिए कोड को पढ़ने के लिए कठिन सही करना गलत तरीके से राउंड इम्हो
jk है।

घड़ी की खिड़की या मध्यवर्ती खिड़की हमेशा इस समस्या का समाधान नहीं होती है, क्योंकि कभी-कभी अभिव्यक्ति को चलाने के लिए थ्रेड की आवश्यकता होती है।
JustAnotherUserYouMayKnowOrNot

@JustAnotherUserYouMayKnowOrNot: हाँ। ब्रेकपॉइंट के भीतर डिबग विंडो में एक संदेश प्रिंट करने की संभावना भी है। ब्रेकपॉइंट पर राइट क्लिक करें और "व्हेन हिट ..." चुनें।
ओलिवियर जैकोट-डेसकोम्बर्स

इसके अलावा अभिव्यक्ति के दुष्प्रभाव हो सकते हैं, इसे फिर से चलाने से समस्याएं हो सकती हैं। परिणाम संस्करण के साथ बेहतर छड़ी।
JustAnotherUserYouMayKnowOrNot

1
जब आप पहले से ही रिटर्न पर होवर करते हैं तो डिबगर्स आपको केवल एक वैल्यू क्यों नहीं दिखा सकते? लगता है जैसे यह वहीं पर ढेर है।
कैंडिड_ओरेंज

10

जब कोड आपके उदाहरण के रूप में आसानी से पढ़ने योग्य होता है, तो इस तरह के एक तार्किक ऑपरेशन के परिणाम को वापस करने में कुछ भी गलत नहीं है return a == 2। हालांकि, अगर रिटर्न वैल्यू अधिक जटिल स्टेटमेंट है या ऐसा कुछ दिखता है

return a > 2? doOptionA().getResult() > makeDecision("greaterThan2") : doOptionB().getResult() == makeDecision("lessThan2");

तब आप पठनीयता के लिए, उस पहले के टुकड़ों को संग्रहीत करने और वापसी विवरण को सरल बनाने के लिए चर का उपयोग करना चाहेंगे।


2

इस तरह के एक साधारण उदाहरण में, या तो एक ठीक है।

अधिक जटिल उदाहरणों के लिए, मैं दूसरा तरीका पसंद करता हूं। यह केवल क्योंकि यह अधिक पठनीय है और दूसरों को कोड बनाए रखने की संभावना होगी।


केवल तभी एक बेहतर चर नाम है result, जो अपने आप में एक पूरी तरह से गैर-वर्णनात्मक और बेकार पहचानकर्ता है।
अलेक्जेंडर - मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.