2012-03-26 12 views
8

मैं दो तरीकों है?सी # पासिंग संदर्भ प्रकार सीधे बनाम बाहर पैरामीटर

List<int> numsA = new List<int>(); 
A(numsA); 

List<int> numsB = new List<int>(); 
B(out numsB); 

सामान्य तौर पर, मैं संदर्भ प्रकार गुजर के रूप में है या के रूप में बाहर मानकों के बीच अंतर समझने की कोशिश कर रहा हूँ।

उत्तर

0

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

http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.80).aspx

6

अपने उदाहरण में, विधि B संकलित करने के लिए है, क्योंकि एक out पैरामीटर अप्रारंभीकृत माना जाता है, ताकि आप इसे प्रारंभ करने से पहले आप इसे उपयोग कर सकते हैं असफल हो जायेगी। इसके अलावा, जब एक out पैरामीटर के साथ एक विधि बुला, तो आप कॉल स्थल पर out कीवर्ड का उल्लेख करने की जरूरत है:

B(out numsB); 

और क्योंकि यह ओवरराइट किया जाएगा आप, कॉल करने से पहले numbsB चर प्रारंभ करने की जरूरत नहीं है विधि द्वारा।

जॉन स्कीट एक महान लेख है कि विभिन्न तरीकों से बताते पैरामीटर भेजने के लिए है: Parameter passing in C#

0

संस्करण बी में समारोह चर के लिए सीधी पहुँच है। यह 'ref' कीवर्ड की तरह है, सिवाय इसके कि चर को पैरामीटर लेने वाले फ़ंक्शन के भीतर से असाइन किया जाना चाहिए। यह आपको फ़ंक्शन से कई मान वापस करने देता है। और कॉल सिंटैक्स 'बी (आउट numsB) है;'

3

स्थानीय चर की तरह एक गैर-रेफरी, गैर-आउट पैरामीटर, भंडारण स्थान को इंगित करता है। यदि संग्रहण स्थान का प्रकार एक संदर्भ प्रकार है, तो संग्रहण स्थान उस प्रकार के उदाहरण के संदर्भ में है।

विपरीत रूप से रेफरी और आउट पैरामीटर एक संग्रहण स्थान का संदर्भ रखें। वह भंडारण स्थान एक स्थानीय चर, एक फ़ील्ड, या एक सरणी तत्व हो सकता है। दूसरे शब्दों में, रेफरी और आउट पैरामीटर संकेतों की एक और परत पेश करते हैं। यदि आपके पास किसी विधि में संदर्भ-प्रकार रेफरी या आउट पैरामीटर है, तो यह किसी ऑब्जेक्ट के संदर्भ के संदर्भ का प्रतिनिधित्व करता है।

आप किसी ऑब्जेक्ट के संदर्भ का संदर्भ क्यों लेना चाहते हैं? यदि आपको ऑब्जेक्ट के संदर्भ को संशोधित करने की आवश्यकता है (जैसा ऑब्जेक्ट को संशोधित करने के विपरीत)।

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

void OrderQueues(ref Queue<int> a, ref Queue<int> b) 
{ 
    if (a.Peek <= b.Peek) return; 
    var temp = a; 
    a = b; 
    b = temp; 
} 

मापदंडों आउट उपयोगी होते हैं:

उदाहरण के लिए, यदि आप एक समारोह है कि दो कतारों जिस पर शीर्ष पर छोटे महत्व है निर्भर करता है का आदेश देता लिखने के लिए चाहते हो सकता है
void OldestAndYoungest(IEnumerable<Person> people, out Person youngest, out Person oldest) 
{ 
    youngest = null; 
    oldest = null; 
    foreach (var person in people) 
    { 
     if (youngest == null || person.Age < youngest.Age) 
      youngest = person; 
     if (oldest == null || oldest.Age < person.Age) 
      oldest = person; 
    } 
} 

मेरे अनुभव में, रेफरी और आउट पैरामीटर काफी दुर्लभ हैं, और संदर्भ प्रकारों के साथ भी दुर्लभ हैं।

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

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