using System; public delegate void DelegateClass(out int var); public class Starter { public static void Main() { DelegateClass del = MethodA(); int var; del(out var); del(out var); del(out var); Console.WriteLine(var); } public static DelegateClass MethodA() { int increment = 0; return delegate(out int var) { var = ++increment; }; } }
The publisher/subscriber relationship is a one-to-many relationship.
using System; class Publisher { public event EventHandler MyEvent; } public class Subscriber { public static void Handler(object obj, EventArgs args) { } public static void Main() { Publisher pub = new Publisher(); pub.MyEvent += Handler; // other processing } }
the syntax of the GetInvocationList method: delegate [] GetInvocationList()
using System; public delegate void DelegateClass(); public class Starter { public static void Main() { DelegateClass del = (DelegateClass) DelegateClass.Combine(new DelegateClass[] { MethodA, MethodB, MethodA, MethodB }); del(); foreach (DelegateClass item in del.GetInvocationList()) { Console.WriteLine(item.Method.Name + " in invocation list."); } } public static void MethodA() { Console.WriteLine("MethodA..."); } public static void MethodB() { Console.WriteLine("MethodB..."); } }
To remove delegates from a multicast delegate, use the Remove method, the minus operator (-), or the -= assignment operator.
using System; public delegate void DelegateClass(); public class Starter { public static void Main(){ DelegateClass del=MethodA; del+=MethodB; del+=MethodC; del=del-MethodB; del(); } public static void MethodA() { Console.WriteLine("MethodA..."); } public static void MethodB() { Console.WriteLine("MethodB..."); } public static void MethodC() { Console.WriteLine("MethodC..."); } }
Arrays of Delegates
using System; public delegate void Task(); public class Starter { public static void Main() { Task[] tasks = { MethodA, MethodB, MethodC }; string resp; tasks[0](); tasks[1](); tasks[2](); } public static void MethodA() { Console.WriteLine("Doing TaskA"); } public static void MethodB() { Console.WriteLine("Doing TaskB"); } public static void MethodC() { Console.WriteLine("Doing TaskC"); } }
Delegates:Multicasting
using System; public class DelegatesMulticasting { delegate void ProcessHandler(string message); static public void Process(string message) { Console.WriteLine("Test.Process("{0}")", message); } public static void Main() { User user = new User("George"); ProcessHandler ph = new ProcessHandler(user.Process); ph = (ProcessHandler) Delegate.Combine(ph, new ProcessHandler(Process)); ph("Wake Up!"); } } public class User { string name; public User(string name) { this.name = name; } public void Process(string message) { Console.WriteLine("{0}: {1}", name, message); } }
Delegates to Instance Members
using System; public class DelegatestoInstanceMembers { delegate void ProcessHandler(string message); public static void Main() { User aUser = new User("George"); ProcessHandler ph = new ProcessHandler(aUser.Process); ph("Wake Up!"); } } public class User { string name; public User(string name) { this.name = name; } public void Process(string message) { Console.WriteLine("{0}: {1}", name, message); } }