C# 中的委托和事件
一、委托
委托可以直接在命名空间下定义而不必在类中定义。
委托实际上是函数指针,有一句话比较重要,叫做变量定义数据,委托定义行为。
非泛型委托以返回类型、各参数类型以及参数的个数作为区别彼此之间的标志;而非泛型委托直接以参数个数作为标志。而且微软已经预定义了 Action
和 Result
两个泛型委托。
参考资料
B 站视频,主要讲述了 delegate 在语义上的特别之处。
二、事件
事件是 C# 的高级特性之一,利用关键字 event
定义,并且在定义时直接说明与之关联的委托。
讲解用例:
先定义两个订阅类,一个猫,一个人,结构简单。
class Cat
{
public void Call()
{
Console.WriteLine("喵喵喵喵喵喵......");
}
}
class Human
{
public void Say()
{
Console.WriteLine("大晚上不让人睡觉的吗?");
}
}
之后再定义事件的发布者,结构比较复杂。
class Mouse
{
public delegate void MouseCallHandler(); // 定义委托
public event MouseHandler MouseCallEvent; // 定义事件
// 这个函数用于管理事件的触发逻辑
protected virtual void OnCall()
{
if (MouseCallEvent != null)
{
MouseCallEvent(); /* 事件被触发 */
}
else
{
Console.WriteLine("事件没有发生");
Console.ReadKey(); /* 回车继续 */
}
}
// 这个函数定义了触发函数
public void Call()
{
Console.WriteLine("吱吱吱吱......");
OnCall(); // 调用了触发逻辑
}
}
之后我们便开始验证,有如下 Main
函数
static void Main(string[] args)
{
Mouse mouse = new Mouse();
Cat cat = new Cat();
Human human = new Human();
// 订阅
mouse.MouseCallEvent += new Mouse.MouseCallHandler(cat.Call);
mouse.MouseCallEvent += new Mouse.MouseCallHandler(human.Say);
// 触发
mouse.Call();
}
结果如下: