2010-08-10 7 views
19

बहुत सीधे आगे। एमएसडीएन का कहना है कि आप रेफरी का उपयोग कर सकते हैं, लेकिन आंशिक तरीकों के लिए बाहर नहीं। मैं के लिए उत्सुक हूं क्यों? यह मेरी समझ थी कि जब कोड संकलित किया जाता है, तो आंशिक विलय हो जाते हैं, तो प्रतिबंध के साथ क्या हो रहा है? कोड फाइल क्लीनर और संगठित (यानी eyecandy) बनाने की तुलना में partial पर और अधिक है?सी # आंशिक विधियां रेफरी का उपयोग क्यों कर सकती हैं, लेकिन बाहर नहीं?

संदर्भ: MSDN Article - "आंशिक तरीकों में ref हो सकता है लेकिन out पैरामीटर नहीं हो सकता है।"

उत्तर

20

आपको विचार करना होगा कि आंशिक विधि लागू नहीं होने पर क्या होता है।

तब क्या होता है कि विधि के सभी कॉल सिर्फ तब तक छीन दिए जाते हैं जैसे कि वे कभी नहीं हुए।

तो एक तरीका है बाहर का उपयोग कर के लिए, यह इस तरह दिखेगा:

stream s; 
GetStream(out s); 
s.Write(...); 

और संकलित किया है जैसे कि यह कहा था कि यह:

stream s; 
s.Write(...); 

इस कोड क्योंकि s नहीं किया गया है की अनुमति नहीं है प्रारंभ। गारंटी है कि जब आप Write विधि को कॉल करने का प्रयास करते हैं तो वैरिएबल प्रारंभ किया जाएगा, GetStream पर कॉल के साथ जुड़ा हुआ था।

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

ref का सवाल है, जो मान्य है के बाद से प्रारंभ बुला कोड द्वारा ध्यान रखा गया है:

stream s = null; 
GetStream(ref s); // may be stripped out 
if (s != null) 
    s.Write(...); 
+2

अच्छी तरह से समझाया! – AlwaysAProgrammer

9

क्योंकि रेफ पैरामीटर के विपरीत, आउटपुट पैरामीटर विधि रिटर्न से पहले शुरू किया जाना चाहिए। यदि आंशिक विधि लागू नहीं की गई है (जो एक मान्य परिदृश्य है, तो इसे कैसे प्रारंभ किया जा सकता है?

+0

और अनियमित मूल्य प्रकार सी # कंपाइलर में कानूनी नहीं है। अच्छी व्याख्या – kokabi

4

मेरा अनुमान होगा क्योंकि out पैरामीटर प्रारंभ करने की आवश्यकता नहीं है जबकि ref पैरामीटर करते हैं।

यदि आपने आंशिक विधि पर out पैरामीटर का उपयोग किया है, तो सी # सत्यापित कैसे कर सकता है कि पैरामीटर प्रारंभ किया गया था या नहीं?

4

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

विकल्प वैरिएबल के मान को विधि कॉल को निष्पादित करने के बजाय स्पष्ट रूप से अपने डिफ़ॉल्ट मान (0, शून्य आदि) पर सेट करना होगा। इस तरह परिवर्तक अभी भी निश्चित रूप से प्रारंभ किया जाएगा - हालांकि डिफ़ॉल्ट मान बहुत उपयोगी नहीं हो सकता है। मेरा मानना ​​है कि सी # टीम ने यह माना है - यह इसे भविष्य के संस्करण में भी बना सकता है, जो जानता है? व्यक्तिगत रूप से मुझे संदेह है कि यह विशेष रूप से उपयोगी होगा, लेकिन संभावना है।

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

1

मैं ग्रहण करेंगे कारण यह है कि केवल एक हस्ताक्षर के साथ एक आंशिक विधि (यानी कोई कार्यान्वयन) अभी भी वैध है। यदि आप एक बाहर पैरामीटर एक कार्यान्वयन कम विधि हमेशा एक त्रुटि उत्पन्न होगी (बाहर मान निर्दिष्ट कोई बात नहीं है के रूप में)

1

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

1

हर किसी ने कहा है के रूप में out पैरामीटर सौंपा जाना चाहिए। इसे जोड़ने के लिए दूसरी ओर कंपाइलर त्रुटि CS0177ref उत्पन्न होगी, कॉल करने से पहले असाइन किया जाना चाहिए।

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

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