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);
}
}

