घटनाक्रम प्रतिनिधियों की अवधारणा पर आधारित हैं, एक प्रतिनिधि मूल रूप से एक विधि हस्ताक्षर परिभाषा है। बस इतना ही। एक इंटरफ़ेस की तरह आप विधि हस्ताक्षर कैसे परिभाषित करते हैं, लेकिन आप उन्हें लागू नहीं करते हैं, तो आप उस इंटरफ़ेस को प्राप्त करने वाले सभी वर्गों में ऐसा करते हैं।
एक प्रतिनिधि एक विधि हस्ताक्षर के लिए एक परिभाषा है, और जिसके लिए आप परिभाषित कर सकते हैं के रूप में कई विधि शरीर की आप की तरह, उदाहरण के लिए, इस प्रतिनिधि (विधि हस्ताक्षर परिभाषा) दिए गए हैं:
public delegate void ChangingHandler (object sender, CarArgs ca);
आप परिभाषित कर सकते हैं इस प्रतिनिधि (विधि हस्ताक्षर परिभाषा) जैसे के साथ शरीर:
public void SomeMethodWhichCreatesADelegateBody()
{
ChangingHandler myChangingHandler = new ChangingHandler(
delegate(object sender, EventArgs e) { /* the method body for myChangingHandler */ }
);
}
यह है, हालांकि एक प्रतिनिधि को परिभाषित करने के लिए एक पुरानी शैली है, अब इसे और अधिक पठनीय प्रतिनिधि कीवर्ड की जगह lambdas उपयोग करने के लिए की तरह मैंने किया विधि शरीर बनाने के लिए , लेकिन यह महत्वपूर्ण नहीं है मुद्दा।
अब घटनाओं को शरीर की एक सरणी के साथ एक प्रतिनिधि (विधि हस्ताक्षर परिभाषा) के रूप में कल्पना की जा सकती है जिसे घटना की सदस्यता लेने के रूप में प्रस्तुत किया जाता है, किसी ईवेंट में विधि निकाय की सदस्यता लेने के लिए वाक्यविन्यास +=
है और इसके लिए वाक्यविन्यास भी है एक घटनाओं सदस्यता जो -=
तो यहाँ इस कोड को एक ChangingHandler प्रतिनिधि के लिए शरीर की की सरणी (विधि हस्ताक्षर परिभाषा) को परिभाषित करता है से एक विधि शरीर को हटाने:
public event ChangingHandler Change;
और तुम शरीर की (उन्हें जोड़ने सदस्यता ले सकते हैं सरणी) कॉलि द्वारा इस समूह के लिए एक विधि में एनजी:
public void SomeMethodWhichSubscribesADelegateBodyToAnEvent()
{
ChangingHandler myChangingHandler = new ChangingHandler(
delegate(object sender, EventArgs e) { /* the method body for myChangingHandler */ }
);
Change += myChangingHandler;
}
अब घटना विधि शरीर है, जो आप को परिभाषित करने और जोड़ने के लिए के रूप में आप चाहते हैं की एक सरणी के लिए के लिए पूरी कारण है, इसलिए है कि जब भी एक घटना वस्तु के अंदर होता है, जो घटना का मालिक है, वह ऑब्जेक्ट उन सभी विधियों को निष्पादित कर सकता है जो आप जो भी करना चाहते हैं, जब वह घटना होती है। ऑब्जेक्ट का स्वामित्व वाला ऑब्जेक्ट ऐसा करता है:
if (Change != null) // You wouldn't access an array without making sure it wasn't null, would you?
{
Change(this, new CarArgs()); // This executes every method body in it's array using the signature definition the delegate defined.
// The delegate simply exists so this code knows the method signature
// so it can know how to call those method body's for you.
}
नोट, आपको स्पष्ट रूप से प्रतिनिधि उदाहरण बनाने की आवश्यकता नहीं है। आप 'कार' कर सकते हैं। बदलें + = car_Change; '(यह सुंदर बेवकूफ है) – bruceboughton