一、将方法作为方法的参数
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Delegate_test 7 { 8 9 /// <summary> 10 /// 定义委托,定义了可以代表的方法的类型 11 /// </summary> 12 /// <param name="name"></param> 13 public delegate void GreetingDelegate(string name); 14 15 class Program 16 { 17 18 /// <summary> 19 /// 中文问好 20 /// </summary> 21 /// <param name="name">名字</param> 22 private static void EnglishGreeting(string name) 23 { 24 Console.WriteLine("Morning, "+name+"!"); 25 } 26 27 /// <summary> 28 /// 英文问好 29 /// </summary> 30 /// <param name="name">名字</param> 31 private static void ChineseGreeting(string name) 32 { 33 Console.WriteLine("早上好, " + name + "!"); 34 } 35 36 /// <summary> 37 /// 定义一个问好的方法 38 /// </summary> 39 /// <param name="name">名字</param> 40 /// <param name="MakeGreeting">代表的方法名称</param> 41 private static void GreetPeople(string name,GreetingDelegate MakeGreeting) 42 { 43 MakeGreeting(name); 44 Console.Read(); 45 46 } 47 48 49 static void Main(string[] args) 50 { 51 GreetPeople("Abner",EnglishGreeting); 52 53 } 54 } 55 }
二、将方法绑定到委托
使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Delegate_test { /// <summary> /// 定义委托,定义了可以代表的方法的类型 /// </summary> /// <param name="name"></param> public delegate void GreetingDelegate(string name); class Program { /// <summary> /// 中文问好 /// </summary> /// <param name="name">名字</param> private static void EnglishGreeting(string name) { Console.WriteLine("Morning, "+name+"!"); } /// <summary> /// 英文问好 /// </summary> /// <param name="name">名字</param> private static void ChineseGreeting(string name) { Console.WriteLine("早上好, " + name + "!"); } /// <summary> /// 定义一个问好的方法 /// </summary> /// <param name="name">名字</param> /// <param name="MakeGreeting">代表的方法名称</param> private static void GreetPeople(string name,GreetingDelegate MakeGreeting) { MakeGreeting(name); Console.Read(); } static void Main(string[] args) { GreetingDelegate Deletegate1 = new GreetingDelegate(EnglishGreeting); Deletegate1 += ChineseGreeting;//给此委托变量再绑定一个方法 Deletegate1 -= EnglishGreeting;//取消对EnglishGreeting方法的绑定 Deletegate1("Abner"); Console.ReadKey(); } } }
三、事件
声明一个事件不过类似于声明一个进行了封装的委托类型的变量而已

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Delegate_test { //定义委托,它定义了可以代表的方法的类型 public delegate void GreetingDelegate(string name); public class GreetingManager { //申明一个事件 public event GreetingDelegate MakeGreet; public void GreetPeople(string name) { if (MakeGreet != null)//如果有方法注册,则调用委托方法 { MakeGreet(name); } } } class Program { /// <summary> /// 中文问好 /// </summary> /// <param name="name">名字</param> private static void EnglishGreeting(string name) { Console.WriteLine("Morning, "+name+"!"); } /// <summary> /// 英文问好 /// </summary> /// <param name="name">名字</param> private static void ChineseGreeting(string name) { Console.WriteLine("早上好, " + name + "!"); } /// <summary> /// 定义一个问好的方法 /// </summary> /// <param name="name">名字</param> /// <param name="MakeGreeting">代表的方法名称</param> private static void GreetPeople(string name,GreetingDelegate MakeGreeting) { MakeGreeting(name); Console.Read(); } static void Main(string[] args) { GreetingManager gm = new GreetingManager(); //注册方法 gm.MakeGreet += ChineseGreeting; gm.MakeGreet += EnglishGreeting; gm.GreetPeople("Abner"); Console.Read(); } } }
C#中的事件处理实际上是一种具有特殊签名的delegate
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace Abner_Action { /* * C#中的事件处理实际上是一种具有特殊签名的delegate */ public class Control { public delegate void MyEventHandler(object sender,MyEventArgs e); public event MyEventHandler MyEvent; public Control() { this.MyEvent += new MyEventHandler(RaiseSomeEvent); } /// <summary> /// 一个事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void RaiseSomeEvent(object sender,MyEventArgs e) { Console.WriteLine("hello"+e.ParamName); } public void RaiseSomeEvent() { Console.Write("Please input 'name':"); string _param = Console.ReadLine(); MyEvent(this,new MyEventArgs(_param)); } } /// <summary> /// 定义一个EventArgs的基类 /// </summary> public class MyEventArgs : System.EventArgs { public string ParamName; public MyEventArgs(string _name) { ParamName = _name; } } class Program { public static void demo4() { Control ctr = new Control(); ctr.MyEvent += new Control.MyEventHandler(ResponseSomeEvent); ctr.RaiseSomeEvent(); } static void Main(string[] args) { demo4(); } public static void ResponseSomeEvent(object sender, EventArgs e) { Console.WriteLine("Some event occur!"); } } }