2012-06-26 19 views
9

तो मैं सी # के लिए नया हूं और मुझे out समझने में कठिनाई हो रही है। के रूप में सिर्फ एक समारोहसी # आउट पैरामीटर बनाम

using System; 
class ReturnTest 
{ 
    static double CalculateArea() 
    { 
     double r=5; 
     double area = r * r * Math.PI; 
     return area; 
    } 

    static void Main() 
    { 
     double output = CalculateArea(); 
     Console.WriteLine("The area is {0:0.00}", output); 
    } 
} 

से कुछ लौटने के लिए विरोध इस

using System; 
class ReturnTest 
{ 
    static void CalculateArea(out double r) 
    { 
     r=5; 
     r= r * r * Math.PI; 
    } 

    static void Main() 
    { 
     double radius; 
     CalculateArea(out radius); 
     Console.WriteLine("The area is {0:0.00}",radius); 
     Console.ReadLine(); 
    } 
} 

की तुलना पहले से एक है मैं कैसे आम तौर पर यह करना होगा। क्या कोई कारण है कि मैं सिर्फ वापसी विवरण के बजाय out का उपयोग करना चाहूंगा? मैं समझता हूं कि ref 2 तरीके संचार के लिए अनुमति देता है, और मुझे आमतौर पर ref का उपयोग नहीं करना चाहिए जब तक कि यह कार्य उस चर के साथ कुछ नहीं कर रहा है जिसे मैं भेज रहा हूं।

हालांकि ऊपर दिखाए गए विवरणों के बाहर और वापसी विवरणों के बीच कोई अंतर है? सिंटेक्स-वार एक या दूसरे का पक्ष लेने का कोई कारण है?

+8

अध्ययन 'डिक्शनरी। ट्रीगेट वैल्यू' और 'int.TryParse'' और देखें कि क्या उदाहरण 'आउट' की उपयोगिता को समझाते हैं। –

+3

'आउट' का उपयोग ज्यादातर तब किया जाता है जब आपको किसी विधि से एकाधिक, असंबंधित मान वापस करने की आवश्यकता होती है। साथ ही, COM या p/invoke के माध्यम से मूल कोड के साथ इंटरऑप करते समय अक्सर पॉइंटर्स को अनुकरण करने के लिए उपयोग किया जाता है। – dlev

+1

सी/सी ++ में याद रखें हमारे पास पॉइंटर्स हैं। जब आप किसी फ़ंक्शन में पॉइंटर पास करते हैं तो आप इसे फ़ंक्शन के भीतर संशोधित कर सकते हैं और कॉलिंग फ़ंक्शन में मूल्य भी बदल जाएगा। बाहर बहुत कुछ वही काम करता है। – carny666

उत्तर

13

परिणाम के लिए out बजाय return का एक अच्छा उपयोग Try पैटर्न है कि आप कुछ विशेष API में देख सकते हैं, उदाहरण के Int32.TryParse(...) के लिए है। इस पैटर्न में, वापसी मूल्य का उपयोग ऑपरेशन की सफलता या विफलता (अपवाद के विपरीत) को इंगित करने के लिए किया जाता है, और out पैरामीटर वास्तविक परिणाम को वापस करने के लिए उपयोग किया जाता है।

Int32.Parse के संबंध में लाभों में से एक गति तेज है, क्योंकि अपवादों से बचा जाता है। कुछ अन्य बेंचमार्क इस अन्य प्रश्न में प्रस्तुत किए गए हैं: Parsing Performance (If, TryParse, Try-Catch)

1

जब एक चर का संबंध है और वापसी ठीक है। लेकिन क्या होगा यदि आप 1 से अधिक मूल्य वापस करना चाहते हैं? Out उसमें मदद करता है।

static void CalculateArea(out double r, out double Foo) 
{ 
    //Can return 2 values in terms of out variables. 
} 

static double CalculateArea(double r) 
{ 
    // Will return only one value. 
} 
2

आप बाहर से अधिक पैरामीटर हो सकता है, इसलिए यदि आप एक से अधिक मान वापस जाने के लिए की जरूरत है, यह थोड़ा अपनी वापसी मूल्यों के लिए एक विशेष वर्ग बनाने की तुलना में आसान है।

+0

विश्वास नहीं कर सकता कि मैंने नहीं किया इस धन्यवाद के बारे में सोचें –

4

केवल एक बार जब मैं out का उपयोग करता हूं तो मुझे एक विधि से लौटाई गई कई चीजों की आवश्यकता होती है। Out आपको कई वस्तुओं को बदले में कक्षा में लपेटने से बचने देता है। Microsoft Out page पर उदाहरण देखें।

8

out कीवर्ड अधिकतर उपयोग किया जाता है जब आप किसी ऑब्जेक्ट में मानों को लपेटने के बिना किसी विधि से एक से अधिक मान वापस करना चाहते हैं।

एक उदाहरण Int32.TryParse विधि है, जिसमें एक वापसी मूल्य (प्रयास की सफलता का प्रतिनिधित्व करने वाला एक बूलियन) है, और एक out पैरामीटर है जो पार्सिंग सफल होने पर मूल्य प्राप्त करता है।

विधि उस ऑब्जेक्ट को वापस कर सकती है जिसमें बुलियन और पूर्णांक दोनों शामिल हैं, लेकिन उस विधि के प्रदर्शन को कम करने के लिए वस्तु को ढेर पर बनाया जाना चाहिए।

+0

मैं प्रदर्शन अंतर (यदि कोई हो) के बारे में भी सोच रहा हूं। एक सी ++ पर्यावरण से आ रहा है तर्क यह है कि मूल्य द्वारा लौटाए जाने पर किसी ऑब्जेक्ट को कॉपी करना अधिक महंगा होता है। क्या यह सी # के लिए भी सच है? मेरा मतलब है कि यदि आप फ़ंक्शन के भीतर एक ब्रांड नई विशाल वस्तु का निर्माण करते हैं और इसे वापस कर देते हैं, तो क्या आप इसे जो कुछ भी दे रहे हैं, उसकी प्रतिलिपि बनाई जाएगी? ऑब्जेक्ट बनाने और इसे बाहर कीवर्ड के माध्यम से बदलने के विरोध में? या यह सी # में अप्रासंगिक है? – Reasurria

+0

@ रीसुर्रिया: यदि आप कोई वस्तु बनाते हैं और इसे वापस करते हैं, तो यह केवल संदर्भ है जो लौटाया जाता है, वस्तुओं को क्लोन नहीं किया जाता है। .NET ऑब्जेक्ट्स में केवल क्लोन किया जाता है यदि आप उन्हें विशेष रूप से क्लोन करते हैं, ऑब्जेक्ट्स पास करने से नई प्रतियां नहीं बनती हैं। – Guffa

+0

धन्यवाद मैं इसे ध्यान में रखूंगा। – Reasurria

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