2010-06-18 20 views
8

पर कॉल करते समय हमें कीवर्ड का उपयोग करने की आवश्यकता क्यों है जब किसी विधि को आउट पैरामीटर के साथ परिभाषित किया गया है, तो मुझे इसे कॉल करते समय बाहर कीवर्ड क्यों निर्दिष्ट करना होगा। यह पहले से ही विधि परिभाषा में है, और रनटाइम को पता होना चाहिए कि पास किया गया कोई भी पैरामीटर आउट पैरामीटर होगा।विधि

यह समझ में आता है कि संकलक विभिन्न अर्थपूर्ण के साथ कीवर्ड के साथ या बिना तर्क को स्वीकार करेगा, लेकिन यदि आपको कोड संकलित करने के लिए कीवर्ड जोड़ना होगा, तो इसका उपयोग क्या होगा? संकलक इसे स्वचालित रूप से संभाल नहीं लेना चाहिए?

रेफरी

+6

मुझे लगता है, यह कोड अधिक पठनीय बनाने के लिए है। – mohang

उत्तर

3

हो सकता है क्योंकि सी # आप इस तरह भार के लिखने के लिए अनुमति देता है:

class X 
{ 
    public void Y(int i) { ... } 
    public void Y(out int i) { ... } 
} 

इस मामले में संकलित keywork out साथ उस विधि को नहीं समझ सकता बुलाया जाना चाहिए जब आप कॉल करता है, तो आप इस कीवर्ड नहीं लिखते प्रक्रिया। और आमतौर पर आपको out लिखना चाहिए जब इस keyworrd के साथ विधि घोषित की जाती है।

और जब आप विधि कॉल करते हैं तो out लिखते हैं, तो आप निश्चित रूप से जानते हैं कि इस बदलाव को विधि में बदला जा सकता है। यह बहुत पठनीय है।

MSDN Article

11

के लिए एक ही यह पठनीयता के लिए वास्तव में बहुत अच्छा है। इसके अलावा यह आपको अप्रत्याशित व्यवहार से बचने में मदद करेगा। आउट पैरा के साथ विधि को कॉल करते समय आपको निश्चित रूप से पता चलेगा कि पास चर के मूल्य को बदला जा सकता है।

+0

यदि आप 'आउट' के साथ पैरामीटर पास करते हैं तो इसे 'बदला जा सकता है' नहीं बदला जाएगा। आउटपुट पैरामीटर विधि रिटर्न से पहले सेट किया जाना चाहिए। – lxalln

+1

हाँ मान मास्ट विधि निकाय ब्लॉक में सेट किया जाना चाहिए, लेकिन मेरा मतलब है कि आप एक ही मूल्य निर्धारित कर सकते हैं ताकि कोई परिवर्तन नहीं देखा जा सके। – Incognito

7

यह आवश्यकता कंपाइलर के लिए नहीं है। f (x, out y) तुरंत सूचित करता है कि yf रिटर्न के बाद f की परिभाषा को देखने की आवश्यकता के बिना, जो भी मानसिक CPU चक्रों को सहेजता है, को कोड को पढ़ रहा है।

0

यह एक अच्छा मुद्दा है, शायद इसे पठनीयता के साथ करना है। कहते हैं की सुविधा देता है बाहर पैरामीटर, किसी को उस विधि बुला पर सिर्फ एक सरल देखो निर्दिष्ट किए बिना हम दो मापदंडों के साथ एक विधि है, इसलिए

bool TryGetString(string input, out string output) 

की तरह, यह बाद से पूरा नहीं होगा।

0

जब आप out कीवर्ड के साथ कोई विधि कॉल करते हैं, तो आपका कॉलिंग कोड निश्चित रूप से जानता है कि यह संदर्भ द्वारा पारित किया गया है। कुछ मामलों में आपको तृतीय पक्ष लाइब्रेरी में एक विधि का सामना करना पड़ सकता है जिसमें उस समय परिभाषा में out कीवर्ड होता है, जब आप उस विधि को कॉल करते हैं, तो आप नहीं जानते कि तर्क संदर्भ या मान द्वारा पारित किया गया है या नहीं। तो आपको readabilty के लिए कॉलिंग विधि में out का उपयोग करने के लिए मजबूर होना पड़ता है।

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