/* * C# Programmers Pocket Consultant * Author: Gregory S. MacBeth * Email: gmacbeth@comporium.net * Create Date: June 27, 2003 * Last Modified Date: */ using System; namespace Client.Chapter_8___Delegates_and_Events { public delegate int MyDelegateEventHandler(MyEventArgs e); public class MyEventSubscriber { static void Main(string[] args) { MyEventPublisher EventPublisher = new MyEventPublisher(); MyEventArgs MyArgs = new MyEventArgs(); MyArgs.MyString = "Hello World"; EventPublisher.MyEvent += new MyDelegateEventHandler(MyHandler); EventPublisher.DoSomething(MyArgs); } static int MyHandler(MyEventArgs e) { Console.WriteLine(e.MyString); return 0; } } public class MyEventArgs: EventArgs { public int MyInt; public long MyLong; public string MyString; } public class MyEventPublisher { public event MyDelegateEventHandler MyEvent; public int DoSomething(MyEventArgs e) { MyEvent(e); return 0; } } }
Author: coder
Use delegate: event
/* * C# Programmers Pocket Consultant * Author: Gregory S. MacBeth * Email: gmacbeth@comporium.net * Create Date: June 27, 2003 * Last Modified Date: */ using System; namespace Client.Chapter_8___Delegates_and_Events { public delegate void MyDelegateEventHandler(int i); public class MyEventSubscriberChapter_8___Delegates_and_Events { static void Main(string[] args) { MyEventPublisher EventPublisher = new MyEventPublisher(); MyDelegateEventHandler MyAnonymousDelegate = delegate(int x) { Console.WriteLine("Anonymous Event FIRED!"); }; EventPublisher.MyEvent += MyAnonymousDelegate; EventPublisher.DoSomething(); } } public class MyEventPublisher { public event MyDelegateEventHandler MyEvent; public int DoSomething() { MyEvent(5); return 0; } } }
Use the bult-in EventHandler delegate
/* C#: The Complete Reference by Herbert Schildt Publisher: Osborne/McGraw-Hill (March 8, 2002) ISBN: 0072134852 */ // Use the bult-in EventHandler delegate. using System; // Declare an event class. class MyEvent { public event EventHandler SomeEvent; // uses EventHandler delegate // This is called to fire SomeEvent. public void OnSomeEvent() { if(SomeEvent != null) SomeEvent(this, EventArgs.Empty); } } public class EventDemo6 { static void handler(object source, EventArgs arg) { Console.WriteLine("Event occurred"); Console.WriteLine("Source is " + source); } public static void Main() { MyEvent evt = new MyEvent(); // Add handler() to the event list. evt.SomeEvent += new EventHandler(handler); // Fire the event. evt.OnSomeEvent(); } }
Create a custom means of managing the event invocation list
/*
C#: The Complete Reference
by Herbert Schildt
Publisher: Osborne/McGraw-Hill (March 8, 2002)
ISBN: 0072134852
*/
// Create a custom means of managing the event invocation list.
using System;
// Declare a delegate for an event.
delegate void MyEventHandler();
// Declare an event class that holds up to 3 events.
class MyEvent {
MyEventHandler[] evnt = new MyEventHandler[3];
public event MyEventHandler SomeEvent {
// Add an event to the list.
add {
int i;
for(i=0; i < 3; i++) if(evnt[i] == null) { evnt[i] = value; break; } if (i == 3) Console.WriteLine("Event list full."); } // Remove an event from the list. remove { int i; for(i=0; i < 3; i++) if(evnt[i] == value) { evnt[i] = null; break; } if (i == 3) Console.WriteLine("Event handler not found."); } } // This is called to fire the events. public void OnSomeEvent() { for(int i=0; i < 3; i++) if(evnt[i] != null) evnt[i](); } } // Create some classes that use MyEventHandler. class W { public void Whandler() { Console.WriteLine("Event received by W object"); } } class X { public void Xhandler() { Console.WriteLine("Event received by X object"); } } class Y { public void Yhandler() { Console.WriteLine("Event received by Y object"); } } class Z { public void Zhandler() { Console.WriteLine("Event received by Z object"); } } public class EventDemo4 { public static void Main() { MyEvent evt = new MyEvent(); W wOb = new W(); X xOb = new X(); Y yOb = new Y(); Z zOb = new Z(); // Add handlers to the event list. Console.WriteLine("Adding events."); evt.SomeEvent += new MyEventHandler(wOb.Whandler); evt.SomeEvent += new MyEventHandler(xOb.Xhandler); evt.SomeEvent += new MyEventHandler(yOb.Yhandler); // Can't store this one -- full. evt.SomeEvent += new MyEventHandler(zOb.Zhandler); Console.WriteLine(); // Fire the events. evt.OnSomeEvent(); Console.WriteLine(); // Remove a handler. Console.WriteLine("Remove xOb.Xhandler."); evt.SomeEvent -= new MyEventHandler(xOb.Xhandler); evt.OnSomeEvent(); Console.WriteLine(); // Try to remove it again. Console.WriteLine("Try to remove xOb.Xhandler again."); evt.SomeEvent -= new MyEventHandler(xOb.Xhandler); evt.OnSomeEvent(); Console.WriteLine(); // Now, add Zhandler. Console.WriteLine("Add zOb.Zhandler."); evt.SomeEvent += new MyEventHandler(zOb.Zhandler); evt.OnSomeEvent(); } } [/csharp]
A class receives the notification when a static method is used as an event handler
/* C#: The Complete Reference by Herbert Schildt Publisher: Osborne/McGraw-Hill (March 8, 2002) ISBN: 0072134852 */ /* A class receives the notification when a static method is used as an event handler. */ using System; // Declare a delegate for an event. delegate void MyEventHandler(); // Declare an event class. class MyEvent { public event MyEventHandler SomeEvent; // This is called to fire the event. public void OnSomeEvent() { if(SomeEvent != null) SomeEvent(); } } class X { /* This is a static method that will be used as an event handler. */ public static void Xhandler() { Console.WriteLine("Event received by class."); } } public class EventDemo3 { public static void Main() { MyEvent evt = new MyEvent(); evt.SomeEvent += new MyEventHandler(X.Xhandler); // Fire the event. evt.OnSomeEvent(); } }
Individual objects receive notifications when instance event handlers are used
/* C#: The Complete Reference by Herbert Schildt Publisher: Osborne/McGraw-Hill (March 8, 2002) ISBN: 0072134852 */ /* Individual objects receive notifications when instance event handlers are used. */ using System; // Declare a delegate for an event. delegate void MyEventHandler(); // Declare an event class. class MyEvent { public event MyEventHandler SomeEvent; // This is called to fire the event. public void OnSomeEvent() { if(SomeEvent != null) SomeEvent(); } } class X { int id; public X(int x) { id = x; } // This is an instance method that will be used as an event handler. public void Xhandler() { Console.WriteLine("Event received by object " + id); } } public class EventDemo2 { public static void Main() { MyEvent evt = new MyEvent(); X o1 = new X(1); X o2 = new X(2); X o3 = new X(3); evt.SomeEvent += new MyEventHandler(o1.Xhandler); evt.SomeEvent += new MyEventHandler(o2.Xhandler); evt.SomeEvent += new MyEventHandler(o3.Xhandler); // Fire the event. evt.OnSomeEvent(); } }
An event multicast demonstration
/* C#: The Complete Reference by Herbert Schildt Publisher: Osborne/McGraw-Hill (March 8, 2002) ISBN: 0072134852 */ // An event multicast demonstration. using System; // Declare a delegate for an event. delegate void MyEventHandler(); // Declare an event class. class MyEvent { public event MyEventHandler SomeEvent; // This is called to fire the event. public void OnSomeEvent() { if(SomeEvent != null) SomeEvent(); } } class X { public void Xhandler() { Console.WriteLine("Event received by X object"); } } class Y { public void Yhandler() { Console.WriteLine("Event received by Y object"); } } public class EventDemo1 { static void handler() { Console.WriteLine("Event received by EventDemo"); } public static void Main() { MyEvent evt = new MyEvent(); X xOb = new X(); Y yOb = new Y(); // Add handlers to the event list. evt.SomeEvent += new MyEventHandler(handler); evt.SomeEvent += new MyEventHandler(xOb.Xhandler); evt.SomeEvent += new MyEventHandler(yOb.Yhandler); // Fire the event. evt.OnSomeEvent(); Console.WriteLine(); // Remove a handler. evt.SomeEvent -= new MyEventHandler(xOb.Xhandler); evt.OnSomeEvent(); } }