Loading

C# 中的委托和事件

一、委托

委托可以直接在命名空间下定义而不必在类中定义。

委托实际上是函数指针,有一句话比较重要,叫做变量定义数据,委托定义行为。


非泛型委托以返回类型、各参数类型以及参数的个数作为区别彼此之间的标志;而非泛型委托直接以参数个数作为标志。而且微软已经预定义了 ActionResult 两个泛型委托。


参考资料

解释委托的B站视频

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();
}

结果如下:


参考资料

讲解事件的B站视频

posted @ 2021-04-07 12:45  endingly  阅读(285)  评论(0编辑  收藏  举报