1.什么是委托
通俗的说:委托就是一个能够存储符合某种格式(方法签名)的方法的指针的容器
2.委托语法
准备一个方法: public string A(string userName){}
public string B(string userName){}
声明委托类:delegate string Dele(string userName);
创建委托对象:Dele dele = new Dele(A);
或 Dele del = A;
追加方法: del +=B;
删除方法: del -=B;
调用委托: del ("张三");
3.多播委托
通常将包含多个方法指针的委托叫做多播委托
其实每个用户定义的委托类型编译后都是一个继承于多播委托的类
4.委托的目的
(1)能将方法作为参数和返回值传递
(2)调用一个委托,执行N个方法(多播委托)
5.委托的缺点
不进行控制的缺点:可以使用Click=null来清除所有注册的事件,可以用Click()来假冒事件的触发。
解决方案,把委托成员做成private的,然后增加AddClickEventHandler、RemoveClickEventHandler两个public方法
6.什么是事件
对委托变量的可访问性进行控制封装
事件就是一个特殊的委托(个人理解)
语法:public delegate void A(string name);
public event A aa;//创建事件委托(本质还是委托对象)
event会自动生成一个private delegate变量和两个函数: add和remove,C#编译器用这两个方法支持+=和-=操作符
用一个简单的小案例:
class Program
{
static void Main(string[] args)
{
//实例化类
Water water = new Water();
Alarm alarm = new Alarm();
Display display = new Display();
water.EventWater += alarm.MakeAlarm;//水烧开会提示警报器
water.EventWater += display.Show;//显示
water.BoilWater();//烧水 调用其方法
Console.ReadKey();
}
}
//定义一个委托
public delegate void WTHander(int a);
//热水器
public class Water
{
//温度
int temp;
public event WTHander EventWater;//声明事件
//烧水
public void BoilWater()
{
for (int i = 0; i <= 100; i++)
{
temp = i;
if (temp > 95)
{
if (EventWater != null)
{
EventWater(temp);//调用注册对象的方法
}
}
}
}
}
//警报器
public class Alarm
{
public void MakeAlarm(int a)
{
Console.WriteLine("Alarm:滴滴滴,水已经{0}度了", a);
}
}
//显示器
public class Display
{
public void Show(int a)
{
Console.WriteLine("Display:水快烧开了,当前温度是{0}度", a);
}
}