C#里面的委托与C++里面的函数指针类似。
委托是一种自定义类型,是一种函数类型(理解为自定义的一种变量)。
delegate void input(string);//这样声明了一个可以存放函数的类型,要求函数是返回值为void,有一个string的参数。Input相当于是个类型名,不是变量名因此需要声明一个变量
input a=aaa;///a是input类型的变量,aaa是static void aaa(string)函数
当然也可以作为函数的参数,与其他变量用法一样
Action委托
Action委托是自定义的一种委托类型,没有返回值,没有参数,所以如果想存储一个无返回值无参数的函数可以直接Action a=aaa;不需要delegate声明
Action<int> a;表示一个有一个int参数无返回值,Action<int a,int a>同上
Func委托
Func委托同上,他是一个必须有返回值,可以有无参数的委托类型。
Func<int, string> a = aaa;//最后一个参数是返回类型,前面的都是参数类型,同Action0~16个参数
Event事件
*事件的声明只能在类里面,作为类的一个成员。
elegate void input(string);//声明了一个委托类型
public event input myinput;//声明了一个委托类型的变量
事件可以理解为是一个数组(委托类型的数组),当触发这个事件的时候这个数组里面的函数都会被调用。比如有一只猫,N只老鼠,当猫来的时候老鼠要逃跑。可以再猫这个类里面声明一个事件。在老鼠的构造函数里面去添加事件(每声明一个老鼠,这个老鼠的逃跑函数就存到了猫里面的事件里面了)。当调用猫的事件的时候所有的老鼠都会跑了
class Cat
{
private string name;
private string color;
public Cat(string name, string color)
{
this.name = name;
this.color = color;
}
public void CatComing()
{
Console.WriteLine(color+"的猫"+name+"过来了,喵喵喵 ...");
if(catCome!=null)
catCome();
}
public event Action catCome;//声明一个事件 发布了一个消息
}
class Mouse
{
private string name;
private string color;
public Mouse(string name, string color,Cat cat)
{
this.name = name;
this.color = color;
cat.catCome += this.RunAway;//把自身的逃跑方法注册进猫里面的事件里面
}
public void RunAway()
{
Console.WriteLine(color+"的老鼠"+name+"说: 老猫来, 赶紧跑, 我跑, 我使劲跑,我加速使劲跑 ...");
}
}
static void Main(string[] args) {
Cat cat = new Cat("加菲猫","黄色");
Mouse mouse1 = new Mouse("米奇","黑色",cat);
Mouse mouse2 = new Mouse("水", "红色", cat);
cat.CatComing();//触发事件,事件里面的所有老鼠身上的逃跑函数都会触发
//cat.catCome();//事件不能再类的外部触发,只能在类的内部触发
Console.ReadKey();
}
注意:添加删除事件只能用+=,-=;