2010-11-27 12 views
49

सी # 4 में, क्या वैकल्पिक आउटपुट पैरामीटर रखने का कोई अच्छा तरीका है?वैकल्पिक आउटपुट पैरामीटर्स

+0

ऐसी सुविधा के लिए कोई मूल्य नहीं दिखता है। यदि आपने पीडीसी पर सी # कंपाइलर लोगों के सत्रों को कभी भी सुना है, तो आप देखेंगे कि प्रत्येक बदलाव का अर्थ है। –

+29

मैं इस बात से असहमत हूं कि इस सुविधा में कोई मूल्य नहीं है। यदि किसी विधि में कुछ तर्क हैं, तो आउट-पैरामीटर के माध्यम से डेटा लौटाते हुए - मैं इस तर्क को कॉल करने में सक्षम होना चाहता हूं, बस आउटपुट की आवश्यकता नहीं है ... – Alex

+1

मैं यह देखने के लिए Int32.TryParse() का उपयोग करता हूं कि दिए गए स्ट्रिंग को किसी संख्या में पार्स किया जा सकता है और यदि ऐसा हो, तो कभी-कभी मुझे इसकी परवाह है। तो जिटबीट सही है। –

उत्तर

5

सं

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

+3

एक 'रेफरी पैरामीटर एक बहुत अलग उपयोग केस है। एक वैकल्पिक पैरामीटर किसी विशिष्ट मान में गुजरता है यदि कॉलर एक निर्दिष्ट पैरामीटर के साथ निर्दिष्ट नहीं करता है, तो कॉलर हमेशा एक मान निर्दिष्ट करता है, चाहे उन्हें लगता है कि उन्होंने इसे निर्दिष्ट किया है या नहीं। 'Ref' हमेशा वैध स्मृति स्थान को इंगित करता है, और एक वैध स्मृति स्थान में हमेशा _something_ होता है। सबसे अच्छा, यह डिफ़ॉल्ट विनिर्देश के लाभ के बिना सिर्फ एक जादू मूल्य है "डिफ़ॉल्ट मान एक्स है।" – danwyand

+2

हाँ, यह उत्तर एक डिज़ाइन निर्णय नहीं है, इसलिए मैंने "इस अर्थ में" क्वालीफायर जोड़ा। – codekaizen

48

वास्तव में नहीं, हालांकि आप हमेशा किसी अन्य विधि के साथ विधि को अधिभारित कर सकते हैं जो आउटपुट पैरामीटर नहीं लेता है।

+3

किसी भी विचार को वैकल्पिक पैरामीटर को '{string dummy' से अधिक सुंदर तरीके से कैसे संभालना है; वापसी फू (बाहर डमी); } 'ओवरलोड में जो आउटपुट पैरामीटर नहीं लेता है? –

+2

@ लुइस: नहीं, शायद यह है कि मैंने क्या किया होगा! – Cameron

+0

यह बहुत अधिक बॉयलर प्लेट कोड है। – Brain2000

2
private object[] Func(); 

असाइन वैकल्पिक आउटपुट वापसी वस्तु सरणी में आप चाहते हैं के रूप में कई और फिर उन्हें का उपयोग करें! लेकिन अगर आप

private void Func(out int optional1, out string optional2) 

की तरह वैकल्पिक उत्पादन कुछ मतलब है और फिर आप की तरह

Func(out i); 

कुछ फोन तो जवाब नहीं आप नहीं कर सकते है। भी सी # और .NET ढांचे में कई डेटा संरचनाएं हैं जो List और Array जैसी बहुत लचीली हैं और आप उन्हें आउटपुट पैरामीटर या रिटर्न प्रकार के रूप में उपयोग कर सकते हैं, इसलिए वैकल्पिक आउटपुट पैरामीटर रखने के लिए कोई तरीका लागू करने की आवश्यकता नहीं है।

7

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

private void Func(
    [Optional] out int optional1, 
    [Optional] out string optional2) 
{ /* ... */ } 

ध्यान दें कि ऊपर (शायद दुर्भाग्य से) संकलन होगा: पिछले नमूना का विस्तार करने के लिए, आप की तरह कुछ मिल चाहते हैं। हालांकि, संकलन करने का प्रयास:

Func(out i); 

असफल हो जायेगी जब तक एक एक पैरामीटर हस्ताक्षर के साथ एक अधिभार स्पष्ट रूप से प्रदान की जाती है।

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

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

0
public class Dummy<T> 
{ 
    public T Value; 
} 

फिर functionDoSomething(out new Dummy<int>().Value, जहां int किसी भी प्रकार हो सकता है का उपयोग करें।

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