首先
明确关键字event在实例化委托时使用而非定义委托时使用。
委托定义与使用
delegate void func();
static func l;
事件定义与使用
delegate void func();
static event func l;
注意关键字的位置,在实例化的时候使用event;
事件需要与类结合起来,定义事件的类才可以调用事件。
delegate void func();
class Program
{
static void Main(string[] args)
{
Person.l();//这里报错Person.l”只能出现在 += 或 -= 的左边(从类型“Person”中使用时除外)
Console.ReadKey();
}
}
class Person{
public static event func l;//这里定义事件
void Action() {
l();//这里没有报错因为这里在定义事件的类里。
}
}
之前讲过,委托就像是一串鞭炮。将函数链接与取消或者触发,可以自由使用。但是事件限定了只能由声明事件的类来触发。而链接函数的过程,可以看做一种通知。这里写一个黑人抬棺的例子
using System;
using System.Data;
using System.IO;
namespace ConsoleApp3
{
delegate void func(string name);
class Program
{
static void Main(string[] args)
{
Person Hei1 = new Person("黑人小哥1");
Person Hei2 = new Person("黑人小哥2");
Person Hei3 = new Person("黑人小哥3");
Person Hei4 = new Person("黑人小哥4");
Person ming = new Person("小明");
ming.died += Hei1.taiGuan;
ming.died += Hei2.taiGuan;
ming.died += Hei3.taiGuan;
ming.died += Hei4.taiGuan;
ming.fellFull += Hei1.seeFull;
ming.fellFull += Hei2.seeFull;
ming.fellFull += Hei3.seeFull;
ming.fellFull += Hei4.seeFull;
ming.fellHungry += Hei1.seeHungry;
ming.fellHungry += Hei2.seeHungry;
ming.fellHungry += Hei3.seeHungry;
ming.fellHungry += Hei4.seeHungry;
int i;
try
{
while (true)
{
Console.WriteLine("请输入小明吃甜甜圈的数量:");
i = int.Parse(Console.ReadLine());
ming.EatDonut(i);
Console.ReadKey();
Console.Clear();
}
}
catch (Exception e)
{
}
}
}
class Person
{
string name;
public event func died;
public event func fellFull;
public event func fellHungry;
public Person(string name)
{
this.name = name;
}
public void EatDonut(int i)
{
if (i <= 10)
{
fellHungry(name);
}
else
{
if (i <= 100)
{
fellFull(name);
}
else
{
if (i > 100)
{
died(name);
}
}
}
}
public void taiGuan(string name)
{
Console.WriteLine(this.name + "收到" + name + "死了,开始抬棺!奏乐!!");
}
public void seeHungry(string name)
{
Console.WriteLine(this.name + "看到" + name + "还很饿");
}
public void seeFull(string name)
{
Console.WriteLine(this.name + "看到" + name + "吃饱了");
}
}
}
利用+=注册事件以后,+=后面的函数何时触发,就由事件声明的主体来控制。因为我们都想知道这件事情发生以后,我们要预期什么效果。而声明类之外的函数,我们只能选择接受"+="或者拒绝接收"-=",我们无法清空"=",或者调用该事件。