2012-11-25 14 views
7

उदाहरण के लिए:+ ऑपरेटर प्रतिनिधियों के संयोजन के लिए कैसे काम करता है?

delegate void SomeDelegate(); 

SomeDelegate a = new SomeDelegate(() => Console.WriteLine("A")); 
SomeDelegate b = new SomeDelegate(() => Console.WriteLine("B")); 

SomeDelegate c = a + b; 

अंतिम पंक्ति में, क्या a + b से अनुवाद करता है? मैं सिर्फ उत्सुक हूं कि मैं उन्हें + ऑपरेटर का उपयोग किए बिना कैसे जोड़ूंगा।

+0

मुझे नहीं पता था कि यह वैध सी # कोड है। – rekire

+0

@rekire: ठीक है पहली पंक्ति एक समारोह के बाहर होगी और अगला 3 एक में होगा। –

उत्तर

5

http://msdn.microsoft.com/en-us/library/ms173172(v=VS.80).aspx - इसके अलावा के लिए खोज:

एक प्रतिनिधि जब लागू एक से अधिक विधि कॉल कर सकते हैं। यह मल्टीकास्टिंग के रूप में जाना जाता है। प्रतिनिधियों की विधियों की सूची में एक अतिरिक्त विधि जोड़ने के लिए - आमंत्रण सूची-बस अतिरिक्त या अतिरिक्त असाइनमेंट ऑपरेटर ('+' या '+ =') का उपयोग करके दो प्रतिनिधियों को जोड़ने की आवश्यकता है। उदाहरण के लिए:

MethodClass obj = new MethodClass(); 
Del d1 = obj.Method1; 
Del d2 = obj.Method2; 
Del d3 = DelegateMethod; 

//Both types of assignment are valid. 
Del allMethodsDelegate = d1 + d2; 
allMethodsDelegate += d3; 

इस बिंदु पर allMethodsDelegate अपने मंगलाचरण सूची-Method1, Method2, और DelegateMethod में तीन तरीकों में शामिल है। मूल तीन प्रतिनिधि, डी 1, डी 2, और डी 3 अपरिवर्तित रहते हैं। जब allMethodsDelegate का आह्वान किया जाता है, तो सभी तीन विधियों को क्रम में बुलाया जाता है। यदि प्रतिनिधि संदर्भ पैरामीटर का उपयोग करता है, तो संदर्भ को क्रमशः तीन तरीकों में से प्रत्येक के लिए पारित किया जाता है, और द्वारा कोई भी परिवर्तन अगली विधि के लिए दृश्यमान होता है। जब किसी भी विधि विधि के भीतर पकड़ा गया अपवाद फेंकता है, तो प्रतिनिधि के कॉलर को अपवाद पास किया जाता है और बाद में आमंत्रण सूची में विधियों को नहीं कहा जाता है।

अद्यतन

दोनों प्रतिनिधियों प्राप्त System.Delegate से आप दो प्रतिनिधियों को एक साथ जोड़ने के लिए combine() तरीकों का उपयोग कर सकते हैं।

+0

हाँ मैं अतिरिक्त काम जानता हूँ। मैं पूछ रहा हूं कि जोड़ कैसे काम करता है। उदाहरण के लिए, आप + ऑपरेटर का उपयोग किए बिना सटीक उसी व्यवहार का अनुकरण कैसे करेंगे। क्या उपयोग करने के लिए कोई फंक्शन है? –

+0

आह, मैं देखता हूं, अपडेट किया गया। – Prescott

+0

क्या आपको इसे इस तरह डालना है: 'कुछ डिलीगेट सी = (कुछ डिलीगेट) प्रतिनिधि। कॉम्बाइन (ए, बी); '? क्या + ऑपरेटर आंतरिक रूप से भी करता है? –

3

यह Delegate.Combine स्थैतिक विधि का उपयोग करके किया जाता है।

SomeDelegate c = Delegate.Combine(a, b) as SomeDelegate; 

+= ऑपरेटर का उपयोग करते समय यह वास्तव में वही है।

// This is the same... 
eventSource.onEvent += OnEvent; 

// ...as this. 
eventSource.onEvent = Delegate.Combine(
    eventSource.onEvent, 
    Delegate.CreateDelegate(typeof(EventSource.OnEvent), this, "OnEvent") 
    ) as EventSource.OnEvent; 

MulticastDelegate वर्ग (delegate कीवर्ड के पीछे वर्ग) आमंत्रण की एक सूची है, लेकिन इस सूची अपरिवर्तनीय है। प्रत्येक बार जब आप += ऑपरेटर के साथ प्रतिनिधियों को गठबंधन करते हैं, तो एक नया MulticastDelegate उदाहरण पूर्व दो प्रतिनिधि वस्तुओं की आमंत्रण सूची को जोड़कर बनाया जाता है।

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