/* Learning C# by Jesse Liberty Publisher: O'Reilly ISBN: 0596003765 */ using System; namespace DelegatesAndEvents { class MyClassWithDelegate { // The delegate declaration. public delegate void StringDelegate(string s); } class MyImplementingClass { public static void WriteString(string s) { Console.WriteLine("Writing string {0}", s); } public static void LogString(string s) { Console.WriteLine("Logging string {0}", s); } public static void TransmitString(string s) { Console.WriteLine("Transmitting string {0}", s); } } public class TesterDelegatesAndEvents { public void Run() { // Define three StringDelegate objects. MyClassWithDelegate.StringDelegate Writer, Logger, Transmitter; // Define another StringDelegate // to act as the multicast delegate. MyClassWithDelegate.StringDelegate myMulticastDelegate; // Instantiate the first three delegates, // passing in methods to encapsulate. Writer = new MyClassWithDelegate.StringDelegate( MyImplementingClass.WriteString); Logger = new MyClassWithDelegate.StringDelegate( MyImplementingClass.LogString); Transmitter = new MyClassWithDelegate.StringDelegate( MyImplementingClass.TransmitString); // Invoke the Writer delegate method. Writer("String passed to Writer "); // Invoke the Logger delegate method. Logger("String passed to Logger "); // Invoke the Transmitter delegate method. Transmitter("String passed to Transmitter "); // Tell the user you are about to combine // two delegates into the multicast delegate. Console.WriteLine( "myMulticastDelegate = Writer + Logger"); // Combine the two delegates; assign the result // to myMulticastDelegate myMulticastDelegate = Writer + Logger; // Call the delegated methods; two methods // will be invoked. myMulticastDelegate( "First string passed to Collector"); // Tell the user you are about to add // a third delegate to the multicast. Console.WriteLine( " myMulticastDelegate += Transmitter"); // Add the third delegate. myMulticastDelegate += Transmitter; // Invoke the three delegated methods. myMulticastDelegate( "Second string passed to Collector"); // Tell the user you are about to remove // the Logger delegate. Console.WriteLine( " myMulticastDelegate -= Logger"); // Remove the Logger delegate. myMulticastDelegate -= Logger; // Invoke the two remaining delegated methods. myMulticastDelegate( "Third string passed to Collector"); } [STAThread] static void Main() { TesterDelegatesAndEvents t = new TesterDelegatesAndEvents(); t.Run(); } } }