看了张子阳博客后,总结了一下个人的理解,原文见:http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html
委托是可以把方法作为参数的一种东东。
把委托声明成与方法的返回值和参数一模一样。
然后把方法赋值给委托变量,委托变量就可以作为参数带入函数。
委托最主要的作用是实现C#中的事件。
C#中的委托型事件需要遵守几个书写规范:
1、委托名称必须以EventHandler结尾。如:PlayEventHandler
2、委托必须声明成两个参数且void,一个Object型的sender参数代表对象本身,一个EventArgs型的参数(或者继承自
EventArgs类)。如:PlayEventHandler(Object sender,EventArgs e)
3、事件变量名称就是委托名称去掉EventHandler后的前面部分。如:Play
4、需要写一个方法以On开始以事件变量名称结束,方法中判断时间变量是否为null,不为null则执行事件。如:OnPlay
5、该方法包含一个参数即委托的第二个参数EventArgs。执行事件参数为委托的两个参数。
6、继承EventArgs类的名称要以EventArgs结尾。
附上实例,修改自张子阳博客
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace firewater { class Program { static void Main(string[] args) { heater ht = new heater(); Alerter at = new Alerter(); ht.Boiled += at.MakeAlert; ht.Boiled += Shower.showtemp; ht.BoilWater(); Console.ReadKey(); } } class heater { private int temperature; public string area = "重庆"; public string type = "日晓101"; public class BoiledEventArgs : EventArgs { public readonly int temperature; public BoiledEventArgs(int temperature) { this.temperature = temperature; } } public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e); //声明委托 public event BoiledEventHandler Boiled; //声明委托型事件 protected virtual void OnBoiled(BoiledEventArgs e) { if(Boiled!=null) { Boiled(this,e); } } public void BoilWater() { for (int i = 0; i <= 100; i++) { temperature = i; if (i > 95) { BoiledEventArgs e = new BoiledEventArgs(temperature); OnBoiled(e); } } } } class Alerter { public void MakeAlert(Object sender,heater.BoiledEventArgs e) { heater ht=(heater)sender; Console.WriteLine("水壶型号{0}", ht.type); Console.WriteLine("水壶产地{0}", ht.area); Console.WriteLine("嘀嘀嘀...水快开了!水温是{0}",e.temperature); } } class Shower { public static void showtemp(Object sender, heater.BoiledEventArgs e) { heater ht = (heater)sender; Console.WriteLine("水壶型号{0}", ht.type); Console.WriteLine("水壶产地{0}", ht.area); Console.WriteLine("当前水温:{0}", e.temperature); } } }