(यह एक सी # नजरिए से सब है।)
मैं एक article about the differences between events and delegates है। इसमें नीचे वर्णित सब कुछ बहुत अधिक विस्तार से शामिल है।
मूल रूप से मुझे किसी संपत्ति की तरह एक घटना के बारे में सोचना पसंद है - यह एक विधि है, यह सब कुछ है। प्राप्त करने/सेट करने के बजाय, एक ईवेंट को जोड़/हटा दिया जाता है - जिसका अर्थ है "इस ईवेंट हैंडलर को जोड़ें" और "इस ईवेंट हैंडलर को हटाएं"। मूल में, यह सब एक घटना है।
सी # भी क्षेत्र-तरह की घटनाओं जो एक शॉर्टकट हैं:
public event EventHandler Foo;
, दोनों एक क्षेत्र और एक घटना वाणी एक लगभग तुच्छ ऐड साथ/कार्यान्वयन को हटा दें। कक्षा के भीतर, Foo
का जिक्र करते हुए क्षेत्र को संदर्भित किया जाता है। कक्षा के बाहर, Foo
का जिक्र करते हुए घटना को संदर्भित किया जाता है।
मूल विचार यह है कि एक ईवेंट किसी अन्य प्रतिनिधि को एक प्रतिनिधि (घटना हैंडलर) में गुज़रकर, सदस्यता लेने और सदस्यता समाप्त करने की अनुमति देता है। आम तौर पर, सब्सक्रिप्शन इवेंट हैंडलर की सूची पिछली सूची और नया एक नया मल्टीकास्ट प्रतिनिधि बनाकर कार्यान्वित किया जाता है।तो अगर आप एक क्षेत्र में ईवेंट हैंडलर्स भंडारण कर रहे हैं myEventHandlers
कहा जाता है, सदस्यता कार्यान्वयन हो सकता है:
myEventHandlers += value;
इसी
आमतौर पर बिना निर्दिष्ट हैंडलर एक नया बहुस्त्र्पीय प्रतिनिधि बनाने शामिल सदस्यता खत्म:
myEventHandlers -= value;
फिर जब आप ईवेंट को जुटाना/आग लगाना चाहते हैं, तो आप केवल उस मल्टीकास्ट प्रतिनिधि को कॉल करें - आम तौर पर किसी भी व्यक्ति ने सब्सक्राइब किए जाने पर अपवाद से बचने के लिए एक नापसंद जांच के साथ:
EventHandler handler = myEventHandlers;
if (handler != null)
{
// You could pass in a different "sender" and "args" of course
handler(this, EventArgs.Empty);
}
घटनाओं का उपयोग करके, ग्राहकों को एक दूसरे के बारे में पता नहीं है, और घटना स्वयं (आमतौर पर) नहीं बढ़ा सकते हैं। दूसरे शब्दों में, यह encapsulation का एक पैटर्न है, जिसे भाषा और मंच दोनों के भीतर स्थिति दी गई है।
नहीं, घटनाएं * प्रतिनिधि नहीं हैं। घटनाएं मूल रूप से विधियों को जोड़/हटाती हैं। यह कहकर कि प्रतिनिधि प्रतिनिधि हैं, कह रहे हैं कि गुण फ़ील्ड हैं। –
आईएमएचओ गुण फ़ील्ड की तरह व्यवहार करेंगे, जैसे घटनाएं मल्टीकास्ट प्रतिनिधियों के रूप में व्यवहार करेंगी। अन्यथा यह वर्ग के उपयोगकर्ता को गुमराह कर रहा है क्योंकि प्रॉपर्टी और फ़ील्ड एक्सेस स्रोत में समान दिखता है जैसे ईवेंट प्रेषण और प्रतिनिधि प्रेषण। इसका मतलब यह नहीं है कि किसी संपत्ति या ईवेंट को डिफ़ॉल्ट कार्यान्वयन (बैकिंग फ़ील्ड, बैकिंग मल्टीकास्ट प्रतिनिधि) का उपयोग करने की आवश्यकता है। इसका मतलब है "संपत्ति/फ़ील्ड: साइड इफेक्ट्स के बिना मूल्य प्राप्त करें/सेट करें" और "ईवेंट/प्रतिनिधि: कॉलबैक चलाएं"। गुण/घटनाओं के साथ भाषा आपको बहुत सारी रस्सी देती है जिसे आप समझदारी से उपयोग कर सकते हैं या खुद को लटका सकते हैं। – froh42