मतभेदों को समझने के लिए आप इस 2 उदाहरणों को देख सकते हैं
प्रतिनिधि के साथ छूट (इस मामले में कार्रवाई जो एक प्रकार का प्रतिनिधि है जो मूल्य वापस नहीं करता है)
public class Animal
{
public Action Run {get; set;}
public void RaiseEvent()
{
if (Run != null)
{
Run();
}
}
}
प्रतिनिधि का उपयोग करने के लिए आपको कुछ ऐसा करना चाहिए
Animale animal= new Animal();
animal.Run += () => Console.WriteLine("I'm running");
animal.Run += () => Console.WriteLine("I'm still running") ;
animal.RaiseEvent();
यह कोड अच्छी तरह से काम करता है लेकिन आपके पास कुछ कमजोर स्पॉट हो सकते हैं।
उदाहरण के लिए अगर मैं यह लिखता हूं
animal.Run += () => Console.WriteLine("I'm running");
animal.Run += () => Console.WriteLine("I'm still running");
animal.Run = () => Console.WriteLine("I'm sleeping") ;
कोड की अंतिम पंक्ति के साथ मैंने पिछले व्यवहारों को केवल एक लापता के साथ ओवरराइड किया था +
(मैंने +
इसके बजाय उपयोग किया है +=
)
एक और कमजोर जगह यह है कि हर वर्ग जो आपकी Animal
कक्षा का उपयोग करता है, RaiseEvent
वह इसे कॉल कर सकता है animal.RaiseEvent()
।
इस कमजोर धब्बों से बचने के लिए आप events
c # का उपयोग कर सकते हैं ।
आपका पशु वर्ग इस तरह से बदल जाएगा
public class ArgsSpecial :EventArgs
{
public ArgsSpecial (string val)
{
Operation=val;
}
public string Operation {get; set;}
}
public class Animal
{
public event EventHandler<ArgsSpecial> Run = delegate{} //empty delegate. In this way you are sure that value is always != null because no one outside of the class can change it
public void RaiseEvent()
{
Run(this, new ArgsSpecial("Run faster"));
}
}
घटनाओं को कॉल करने के लिए
Animale animal= new Animal();
animal.Run += (sender, e) => Console.WriteLine("I'm running. My value is {0}", e.Operation);
animal.RaiseEvent();
अंतर:
- आप सार्वजनिक संपत्ति का उपयोग नहीं कर रहे हैं, लेकिन एक सार्वजनिक फ़ील्ड (ईवेंट्स के साथ कंपाइलर आपके खेतों को अवांछित पहुंच से बचाता है)
- घटनाओं को सीधे नहीं सौंपा जा सकता है। इस मामले में आप पिछली त्रुटि नहीं कर सकते हैं जो मैंने व्यवहार को ओवरराइड करने के साथ दिखाया है।
- आपकी कक्षा के बाहर कोई भी इस घटना को नहीं बढ़ा सकता।
- घटनाओं को एक इंटरफ़ेस घोषणा में शामिल किया जा सकता है, जबकि एक क्षेत्र नहीं कर सकता
टिप्पणियाँ
EventHandler निम्नलिखित प्रतिनिधि के रूप में घोषित किया जाता है:
public delegate void EventHandler (object sender, EventArgs e)
यह एक प्रेषक (वस्तु प्रकार) और घटना तर्क लेता है। यदि यह स्थिर विधियों से आता है तो प्रेषक अशक्त है।
आप EventHAndler
इस उदाहरण का उपयोग करने के बजाय इसका उपयोग भी कर सकते हैंEventHandler<ArgsSpecial>
EventHandler के बारे में प्रलेखन के लिए यहाँ देखें