看了张子阳博客后,总结了一下个人的理解,原文见: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);
}
}
}