दिलचस्प पोस्ट
जब आप "@" लिखते हैं तो सुझाव दिखाने के लिए jquery UI स्वत: पूर्ण कार्यान्वित करना रिसाइकिलवेव एडेप्टर संलग्न नहीं; लेआउट लंघन मैं अपने सी # WinForm एप्लिकेशन को कैसे पुनरारंभ करूं? क्या पाठ एक पाठ क्षेत्र में एक नई लाइन का प्रतिनिधित्व करता है रेल 3 सक्रियरेकॉर्ड: एसोसिएशन पर गिनती से आदेश किसी फ़ंक्शन में डेटा.फ्रेम स्तंभ नाम दें स्ट्रिंग को JSON सरणी में कनवर्ट करें स्ट्रोक चौड़ाई ट्रांसफ़ॉर्म (SWT) कार्यान्वयन (जावा, सी # …) आईफ़ोन – एक ही समय में कई फोंट के साथ टेक्स्ट युक्त यूआईएलबल JQuery में एक <UL> / <OL> आदेश का सबसे आसान तरीका क्या है? नई स्वचालित संदर्भ गिनती तंत्र कैसे काम करता है? टैबिल डेटा के रूप में प्रिंटिंग सूचियां एंड्रॉइड: getSupportActionBar () हमेशा ActionBarSherlock पुस्तकालय में शून्य प्रदान करता है स्लैश का उपयोग करें sed में बदलें WPF और इकाई फ़्रेमवर्क के साथ डेटाएनेटेशन का उपयोग कर डेटा सत्यापित करें?

कौन सा बेहतर है, रिटर्न वैल्यू या आउट पैरामीटर?

अगर हम किसी विधि से एक मूल्य प्राप्त करना चाहते हैं, तो हम या तो वापसी मूल्य का उपयोग कर सकते हैं, जैसे:

public int GetValue(); 

या:

 public void GetValue(out int x); 

मैं वास्तव में उन दोनों के बीच मतभेदों को नहीं समझता, और इसलिए, यह नहीं पता कि कौन सा बेहतर है क्या आप मुझे यह समझा सकते हैं?

धन्यवाद।

वेब के समाधान से एकत्रित समाधान "कौन सा बेहतर है, रिटर्न वैल्यू या आउट पैरामीटर?"

वापसी मान लगभग हमेशा सही विकल्प होते हैं जब विधि में वापसी के लिए कुछ और नहीं होता है (वास्तव में, मैं किसी भी ऐसे मामलों के बारे में नहीं सोच सकता जहां पर मुझे कोई विकल्प out मिलना चाहिए, अगर मुझे पसंद होता है। C # 7 भाषा समर्थित डिकोडक्शन के लिए Deconstruct तरीकों का एक बहुत ही दुर्लभ अपवाद है यह नियम।)

किसी और चीज़ के अलावा, यह कॉलर अलग से चर घोषित करने से रोकता है:

 int foo; GetValue(out foo); 

बनाम

 int foo = GetValue(); 

आउट मान भी इस तरह से विधि को रोकते हैं:

 Console.WriteLine(GetValue().ToString("g")); 

(वास्तव में, यह संपत्ति के सेटर्स के साथ समस्याओं में से एक है, और यही कारण है कि बिल्डर पैटर्न ऐसे तरीकों का उपयोग करता है जो बिल्डर को लौटाते हैं, उदाहरण के लिए myStringBuilder.Append(xxx).Append(yyy) ।)

इसके अतिरिक्त, पैरामीटर नीचे प्रतिबिंब के साथ उपयोग करने के लिए थोड़ा कठिन होता है और आमतौर पर भी कठिन परीक्षण करता है। (अधिक प्रयास आम तौर पर आउट पैरामीटर की तुलना में बदले मूल्य का नकली बनाना आसान बनाते हैं)। असल में वहाँ कुछ भी नहीं है जो मैं सोच सकता हूँ कि वे आसान बनाते हैं

वापसी मूल्य एफटीडब्लू

संपादित करें: क्या हो रहा है इसके संदर्भ में …

असल में जब आप एक "आउट" पैरामीटर के लिए एक तर्क में पास करते हैं, तो आपको एक वेरिएबल में पास करना होगा। (अर्रे तत्वों को वैरिएबल्स के रूप में भी वर्गीकृत किया जाता है।) आपके द्वारा कॉल करने वाला तरीका पैरामीटर के अपने स्टैक पर "नया" वेरिएबल नहीं है – यह आपके चर के भंडारण के लिए उपयोग करता है वेरिएबल में कोई बदलाव तुरंत दिखाई देगा। यहां अंतर दिखाने वाला एक उदाहरण है:

 using System; class Test { static int value; static void ShowValue(string description) { Console.WriteLine(description + value); } static void Main() { Console.WriteLine("Return value test..."); value = 5; value = ReturnValue(); ShowValue("Value after ReturnValue(): "); value = 5; Console.WriteLine("Out parameter test..."); OutParameter(out value); ShowValue("Value after OutParameter(): "); } static int ReturnValue() { ShowValue("ReturnValue (pre): "); int tmp = 10; ShowValue("ReturnValue (post): "); return tmp; } static void OutParameter(out int tmp) { ShowValue("OutParameter (pre): "); tmp = 10; ShowValue("OutParameter (post): "); } } 

परिणाम:

 Return value test... ReturnValue (pre): 5 ReturnValue (post): 5 Value after ReturnValue(): 10 Out parameter test... OutParameter (pre): 5 OutParameter (post): 10 Value after OutParameter(): 10 

अंतर "पोस्ट" चरण में है – यानी स्थानीय चर या पैरामीटर बदल जाने के बाद रिटर्न वैल्यू टेस्ट में, यह स्थिर value वैरिएबल में कोई फर्क नहीं पड़ता है। OutParameter परीक्षण में, value चर tmp = 10; द्वारा बदल दिया है tmp = 10;

आम तौर पर आपको बाहर के परम पर रिटर्न वैल्यू देना चाहिए। यदि आप खुद को लेखन कोड पाते हैं जो 2 चीजें करने की ज़रूरत होती है, तो आउट परामर्शी एक अत्याचारी बुराई है इस का एक अच्छा उदाहरण है कोशिश पैटर्न (जैसे Int32.TryParse)।

मान लीजिए कि आपके दो तरीकों के कॉलर को क्या करना होगा। पहले उदाहरण के लिए मैं यह लिख सकता हूँ …

 int foo = GetValue(); 

ध्यान दें कि मैं एक वैरिएबल घोषित कर सकता हूं और इसे अपने तरीके से एक पंक्ति में आवंटित कर सकता हूं। 2 उदाहरण के लिए यह इस तरह दिखता है …

 int foo; GetValue(out foo); 

मुझे अब अपने वैरिएबल को सामने आने और मेरी कोड दो पंक्तियों पर लिखने के लिए मजबूर कर दिया गया है

अद्यतन करें

इन प्रकार के प्रश्न पूछते समय देखने के लिए एक अच्छी जगह है। नेट फ्रेमवर्क डिज़ाइन दिशानिर्देश। यदि आपके पास पुस्तक संस्करण है तो आप इस विषय पर एंडर हेजल्स्बर्ग और अन्य लोगों द्वारा टिप्पणियां देख सकते हैं (पृष्ठ 184-185) लेकिन ऑनलाइन संस्करण यहां है …

http://msdn.microsoft.com/en-us/library/ms182131(VS.80).aspx

यदि आप पाते हैं कि दो चीजों को एपीआई से वापस करने की ज़रूरत है तो एक संरचना / वर्ग में उन्हें लपेटकर एक बाहरी परम से बेहतर होगा।

क्या बेहतर है, आपकी विशेष स्थिति पर निर्भर करता है। एक कारण कॉल से कई मूल्यों को लौटने की सुविधा प्रदान करने के लिए एक कारण मौजूद है:

 public int ReturnMultiple(int input, out int output1, out int output2) { output1 = input + 1; output2 = input + 2; return input; } 

तो परिभाषा के अनुसार किसी अन्य की तुलना में बेहतर नहीं है लेकिन आम तौर पर आप एक साधारण रिटर्न का उपयोग करना चाहते हैं, जब तक आप ऊपर की स्थिति में उदाहरण नहीं देते।

संपादित करें: यह एक ऐसा नमूना है जो कीवर्ड का एक कारण बताता है। उपरोक्त किसी भी तरह से सबसे अच्छा अभ्यास नहीं माना जाता है।

एक बाहरी परम का उपयोग करने का एक कारण है जो पहले से उल्लेख नहीं किया गया है: कॉलिंग विधि इसे प्राप्त करने के लिए बाध्य है। यदि आपकी पद्धति एक मूल्य का उत्पादन करती है जिसे कॉल करने वाला नहीं छोड़ना चाहिए, तो यह कॉलर को विशेष रूप से स्वीकार करने के लिए मजबूर करता है:

  Method1(); // Return values can be discard quite easily, even accidentally int resultCode; Method2(out resultCode); // Out params are a little harder to ignore 

बेशक, कॉलर अभी भी एक out परम में मूल्य की अनदेखी कर सकता है, लेकिन आपने इसे अपना ध्यान बुलाया है।

यह एक दुर्लभ आवश्यकता है; अधिक बार, आपको वास्तविक समस्या के लिए एक अपवाद का उपयोग करना चाहिए या "एफवाईआई" के लिए राज्य की जानकारी के साथ किसी वस्तु को वापस करना चाहिए, लेकिन ऐसे हालात भी हो सकते हैं जहां यह महत्वपूर्ण है।

यह वरीयता मुख्य रूप से है

मैं रिटर्न पसंद करता हूं और अगर आपको कई रिटर्न मिलते हैं तो आप उसे डीटीओ के परिणाम में लपेट सकते हैं

 public class Result{ public Person Person {get;set;} public int Sum {get;set;} } 

आपको लगभग हमेशा एक वापसी मूल्य का उपयोग करना चाहिए। ' out ' मापदंडों बहुत सी एपीआई, रचनात्मकता, आदि के लिए घर्षण का एक सा बनाते हैं।

सबसे महत्वपूर्ण अपवाद जो मन में TryParse , जब आप एकाधिक मूल्य (नेट फ्रेमवर्क में 4.0 तक ट्यूपल्स नहीं) करना चाहते हैं, जैसे कि TryParse पैटर्न के साथ।

आपके पास केवल एक वापसी मूल्य हो सकता है, जबकि आपके पास एकाधिक आउट पैरामीटर हो सकते हैं।

उन मामलों में आपको केवल मापदंडों पर विचार करने की आवश्यकता है

हालांकि, अगर आपको अपनी पद्धति से एक से अधिक पैरामीटर वापस करने की आवश्यकता है, तो आप शायद उस ओर से देखना चाहते हैं कि आप ओ ओ दृष्टिकोण से लौट रहे हैं और विचार करें कि यदि आप बेहतर हैं तो इन ऑब्जेक्ट या संरचना के साथ इन पैरामीटर वापस लौटें इसलिए आप फिर से एक वापसी मूल्य पर वापस आ गए हैं।

मैं इस सरल उदाहरण में उन दोनों के बजाय निम्नलिखित को पसंद करता हूं।

 public int Value { get; private set; } 

लेकिन, वे सभी बहुत ही समान हैं। आम तौर पर, वे केवल 'आउट' का इस्तेमाल करते हैं, यदि उन्हें विधि से कई मूल्य वापस करने की आवश्यकता होती है। यदि आप विधि में और बाहर का मान भेजना चाहते हैं, तो कोई भी 'रेफ़' चुन सकता है। मेरी पद्धति सबसे अच्छी है, यदि आप केवल एक मान वापस कर रहे हैं, लेकिन यदि आप एक पैरामीटर पास करना चाहते हैं और एक मान वापस प्राप्त करना चाहते हैं, तो शायद आपकी पहली पसंद चुननी होगी।

दोनों के पास एक अलग उद्देश्य है और संकलक द्वारा इसका इलाज नहीं किया जाता है। यदि आपके विधि को एक मान वापस करने की आवश्यकता है, तो आपको रिटर्न का उपयोग करना होगा। आउट उपयोग किया जाता है जहां आपके विधि को एकाधिक मान वापस करने की आवश्यकता होती है।

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

कोई वास्तविक अंतर नहीं है, बाहर पैरामीटर सी # में हैं विधि को एक और अधिक मूल्य की अनुमति देने के लिए, सब कुछ।

हालांकि कुछ मामूली अंतर हैं, लेकिन उनमें से कोई भी वास्तविक महत्व नहीं है:

पैरामीटर का उपयोग करना आपको दो लाइनों का उपयोग करने के लिए लागू करेगा जैसे कि:

 int n; GetValue(n); 

जबकि वापसी मूल्य का उपयोग करते हुए आप इसे एक पंक्ति में कर सकेंगे:

 int n = GetValue(); 

एक और अंतर (केवल मान प्रकारों के लिए सही है और यदि सी # फ़ंक्शन को इनलाइन नहीं करता है) तो यह है कि वापसी मूल्य का उपयोग करना जरूरी मूल्य की प्रतिलिपि बना देगा, जब OUT पैरामीटर का उपयोग करते हुए फ़ंक्शन वापसी अनिवार्य रूप से ऐसा नहीं करेगा।

जैसा कि अन्य लोगों ने कहा है: रिटर्न वैल्यू, परम नहीं।

क्या मैं आपको "फ्रेमवर्क डिज़ाइन दिशानिर्देश" (द्वितीय संस्करण) पुस्तक की सिफारिश कर सकता हूं? पृष्ठ 184-185 पैरामीटर से बाहर रहने के कारणों को कवर करते हैं पूरी किताब आपको सही दिशा में एनआईटी कोडिंग मुद्दों के हर तरह से आगे बढ़ेगी।

फ़्रेमवर्क डिज़ाइन दिशानिर्देशों के साथ संबद्ध, स्थिर विश्लेषण उपकरण, FxCop का उपयोग है। आपको यह माइक्रोसॉफ्ट की साइटों पर मुफ्त डाउनलोड के रूप में मिलेगा। इसे अपने संकलित कोड पर चलाएं और देखें कि यह क्या कहता है। यदि यह सैकड़ों और सैकड़ों चीजों के बारे में शिकायत करता है … तो चिंता मत करो! प्रत्येक मामले के बारे में जो कहते हैं, उसे शांत और ध्यान से देखें चीजों को ठीक करने के लिए जल्दी मत करो ASAP जानें कि वह क्या कह रहा है आप को स्वामित्व के लिए सड़क पर डाल दिया जाएगा

मुझे लगता है कि कुछ परिदृश्यों में से एक यह उपयोगी होगा जहां अप्रबंधित स्मृति के साथ काम करना होगा, और आप इसे स्पष्ट करना चाहते हैं कि "लौटा" मान का मैन्युअल रूप से निपटा जाना चाहिए ।

इसके अतिरिक्त, वापसी मूल्य अतुल्यकालिक डिजाइन मानदंडों के साथ संगत हैं।

यदि आप रेफरी या आउट पैरामीटर का उपयोग करते हैं, तो आप "async" फ़ंक्शन निर्दिष्ट नहीं कर सकते

संक्षेप में, वापसी मान विधि chaining, क्लीनर वाक्यविन्यास (कॉलर को अतिरिक्त चर घोषित करने की आवश्यकता को समाप्त करके) की अनुमति देते हैं, और भविष्य में पर्याप्त संशोधन की आवश्यकता के बिना अतुल्यकालिक डिजाइनों की अनुमति देते हैं।

बाहर अधिक उपयोगी है जब आप किसी वस्तु को वापस करने की कोशिश कर रहे हैं जिसे आप विधि में घोषित करते हैं।

उदाहरण

 public BookList Find(string key) { BookList book; //BookList is a model class _books.TryGetValue(key, out book) //_books is a concurrent dictionary //TryGetValue gets an item with matching key and returns it into book. return book; } 

वापसी मूल्य सामान्य मान है जो आपके विधि द्वारा वापस किया जाता है।

जहां पैरामीटर के बाहर , अच्छी तरह से और रेफरी में सी 2 के दो प्रमुख शब्द हैं वे संदर्भ के रूप में चर को पारित करने की अनुमति देते हैं।

रेफरी और आउट के बीच का बड़ा अंतर है, रेफरी को पहले और बाद में प्रारंभ नहीं किया जाना चाहिए

रिटर्न प्रकार के बाउल वाले कीवर्ड का उपयोग करना, कभी-कभी कोड ब्लोट को कम कर सकता है और पठनीयता बढ़ा सकता है। (मुख्यतः जब परोपर में अतिरिक्त जानकारी अक्सर अनदेखी की जाती है।) उदाहरण के लिए:

 var result = DoThing(); if (result.Success) { result = DoOtherThing() if (result.Success) { result = DoFinalThing() if (result.Success) { success = true; } } } 

बनाम:

 var result; if (DoThing(out result)) { if (DoOtherThing(out result)) { if (DoFinalThing(out result)) { success = true; } } }