委托:
将方法以变量形式传递,并且以方法形式执行。
举例:
int a; //声明了一个整数类型的变量a
public delegate void sayHelloDlg(); //声明了一个无参无返回值的委托sayHelloDlg
比较:
我们声明了一个整数变量"a",它的类型是int, 这个是比较容易理解和接受的;
“sayHelloDlg”可以看作是当前委托作用域下所有方法的类型。
namespace DelegateAndEvent {
// 通常声明一个委托的时候,我们将它的作用域设置成全局的
// 这是一个有参无返回值的函数,要想应用该委托,下面声明的方法需要与该委托签名保持一致。 签名:【返回值类型,参数列表】
public delegate void sayHelloDlg(string name);
class Program {
//声明一个sayHelloDlg 类型的事件
public static event sayHelloDlg sayHelloEvent;
static void Main(string[] args) {
// 实例化Demo类
Demo demo = new Demo();
// 申明一个委托类型的变量“dlg”,将Demo类中的sayHello()函数赋值给该变量,注意函数赋值时不需要添加“()”
sayHelloDlg dlg = demo.sayHello;
// 通过委托调用该方法
dlg("小明");
![控制台输出结果](https://img-blog.csdnimg.cn/20210309163022727.jpg#pic_center)
//委托链
dlg += demo.sayGoodBye; //调用多个函数,一起生效
dlg -= demo.sayGoodBye; //取消掉demo.sayGoodBye的使用
//匿名函数
//当我们想要创建一个函数,并且该函数仅被调用一次,我们就可以采取以下的方式创建一个匿名函数:
sayHelloDlg dlg1 = delegate (string name) {
Console.WriteLine($"{name},我是匿名函数");
};
dlg1("小红");
![控制台输出结果](https://img-blog.csdnimg.cn/20210309163116558.jpg#pic_center)
//lamda函数
//进一步简化了代码,比匿名函数更加的简洁,只需要写一个参数,再通过 "= >"直接书写方法体
sayHelloDlg dlg2 = (name) =>
{
Console.WriteLine($"{name},我是lamda");
};
dlg2("小张");
![控制台输出结果](https://img-blog.csdnimg.cn/20210309163149367.jpg#pic_center)
//添加订阅事件
sayHelloEvent += getSayHelloEvent;
// sayHelloEvent -= getSayHelloEvent; //取消订阅事件
// 调用事件
if (sayHelloEvent != null) sayHelloEvent("小刘");
![控制台输出结果](https://img-blog.csdnimg.cn/20210309163218469.jpg#pic_center)
}
//定义一个静态方法
public static void getSayHelloEvent(string name) {
Console.WriteLine($"{name},我是事件!");
}
}
class Demo {
// 有参无返回值的函数
public void sayHello(string name) {
Console.WriteLine($"{name},你好呀!");
}
// 有参无返回值的函数
public void sayGoodBye(string name) {
Console.WriteLine($"{name},再见啦!");
}
}
}
总体而言,一个委托的开发步骤如下:
定义一个委托----->定义一个委托类型的变量------->给委托赋值(绑定方法)------->调用委托
事件: 可以看作是一个特殊签名的委托
步骤:
1.首先必须声明该事件的委托类型 格式:修饰符 delegate void 委托名 (参数)
2.声明事件本身,使用 event 关键字(需要基于上面的委托定义事件) 格式:修饰符 event 委托名 EventHandler 事件名
这样我们就定义了一个委托和一个事件,该事件在生成的时候会调用委托。