मैं सी # में घटनाक्रम/प्रतिनिधियों के बारे में सीख रहा हूं। क्या मैं आपके द्वारा चुनी गई नामकरण/कोडिंग शैली (हेड फर्स्ट सी # पुस्तक से लिया गया) पर आपकी राय पूछ सकता हूं?घटनाक्रम - नामकरण सम्मेलन और शैली
मैं इस बारे में एक दोस्त को पढ़ रहा हूं, और अवधारणाओं को समझाने के सबसे सुंदर तरीके से आने की कोशिश कर रहा हूं। (सोचा एक विषय को समझने के लिए सबसे अच्छा तरीका है कोशिश करते हैं और यह सिखाने के लिए है!)
class Program
{
static void Main()
{
// setup the metronome and make sure the EventHandler delegate is ready
Metronome metronome = new Metronome();
// wires up the metronome_Tick method to the EventHandler delegate
Listener listener = new Listener(metronome);
metronome.OnTick();
}
}
public class Metronome
{
// a delegate
// so every time Tick is called, the runtime calls another method
// in this case Listener.metronome_Tick
public event EventHandler Tick;
public void OnTick()
{
while (true)
{
Thread.Sleep(2000);
// because using EventHandler delegate, need to include the sending object and eventargs
// although we are not using them
Tick(this, EventArgs.Empty);
}
}
}
public class Listener
{
public Listener(Metronome metronome)
{
metronome.Tick += new EventHandler(metronome_Tick);
}
private void metronome_Tick(object sender, EventArgs e)
{
Console.WriteLine("Heard it");
}
}
N.B. कोड http://www.codeproject.com/KB/cs/simplesteventexample.aspx
सुरक्षा के लिए वैकल्पिक "= प्रतिनिधि {};" जोड़ना है घोषणा करने के लिए (देखें http://stackoverflow.com/questions/231525/raising-c-events-with-an-extension-method-is-it-bad/231536#231536) – Benjol
ध्यान दें कि भेद्यता _limited_ नहीं है बहुप्रचारित वातावरण। किसी ईवेंट से सभी हैंडलर को निकालने के लिए एक ईवेंट हैंडलर के लिए यह संभव है (यदि सोसायपाथिक), जिसके परिणामस्वरूप हैंडलर पूरा हो जाता है और ईवेंट आमंत्रण अगले (अब मौजूद नहीं) ईवेंट को चलाने का प्रयास करता है। –
@GregD: क्या मूर्खतापूर्ण तरीके से ऐसा करने का कोई तरीका है कि क्लाइंट कोड ऐसा नहीं कर सका? –