C#中委托和事件的理解

时间:2022-11-24 05:49:40

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