委托(delegate)
定义委托的语法:
[属性] [修饰符] delegate 返回类型 委托类型名(参数列表);
委托没有具体的实现体,它能够代表什么样的方法由它的返还值和参数列表决定
委托的实例化:
委托类型名和类名一样,都用于创建对象,用委托类型创建的对象就是委托对象。
语法:
委托对象 = new 委托类型(关联方法)
一个简单实用了委托的例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1 //命名空间,相当于java中的包
{
class Person //一个主类,于java中不同,主类名不需要和文件名相同
{
delegate int myDelegrate(int a, int b); //申明一个委托,返回值为整形,有两个参数
public class A
{
public static int AddTwo(int x, int y) //在类A中创建一个AddTwo的静态方法(其他非虚方法都可以)
{
return x + y;
}
}
public class B //这个方法中有主方法
{
public static void Main()
{
myDelegrate mD = new myDelegrate(A.AddTwo); //创建一个委托变量mD,是在最前面主类中申明的委托类型,它的关联方法是A类中的静态方法AddTwo
int sum = mD(2, 2); //此时的mD委托变量就相当于上一句中的A.AddTow()方法
Console.WriteLine(sum);
Console.Read();
}
}
}
}
事件
定义事件的语法:
[访问修饰符] event 委托名 事件名;
一个实例,有一个热水器,当温度达到96度时,会发出警报,显示温度:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Heater
{
private int temperature;
public delegate void BoilHandler(int param); //定义一个委托类型,无返回类型,有一个参数
public event BoilHandler BoilEvent; //定义一个事件,委托类型为BoilHandler,事件名称为BoilEvent
public void BoilWater() //定义一个烧水的函数
{
for(int i = 0; i<100; i++) //温度从0开始,一直到100
{
temperature = i;
if(temperature >= 96) //当温度大于等于96度时,会引发事件
{
if(BoilEvent != null) //判断一下事件是否为空,及是否定义
{
BoilEvent(temperature);
}
}
}
}
public class Alarm //在这个类中有一个提示烧水的函数
{
public void MakeAlert(int param)
{
Console.WriteLine("滴滴滴~,水已经到了 {0} 度了", param);
}
}
public class Display //在这个类中,有一个提示水快烧开的函数
{
public static void ShowMsg(int param)
{
Console.WriteLine("display:水快烧开了,当前温度:{0}",param);
}
public void a(int b)
{
Console.WriteLine("反正就是输入了");
}
}
public static void Main()
{
Heater heater = new Heater(); //创建一个主类,即热水器类
Alarm alarm = new Alarm(); //创建报警器类
使用 += 号来订阅方法:
heater.BoilEvent += alarm.MakeAlert; //给热水器类的事件订阅事件 ,使用的是+=符号
heater.BoilEvent += Display.ShowMsg; //再订阅一个静态方法
Display dis = new Display();
heater.BoilEvent += dis.a; //a方法是临时加的,我看到可以订阅多个事件感到奇怪,然后又加了一个。
heater.BoilWater();
Console.ReadKey();
}
}
}
运行结果: