• CSharp(C#)语言_委托和事件区别详解


    委托和事件的概念

    委托

      C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。它本质上也是一个类。

    • 它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法

    事件

      事件由对象引发,通过我们提供的代码来处理。一个事件我们必须订阅(Subscribe)他们,订阅一个事件的含义就是提供代码,在这个事件发生时执行这些代码,这些代码称为事件处理程序。

      事件是在委托类型变量前加上 event 关键字,其本质是用来对委托类型的变量进行封装,类似于类的属性对字段的封装。

    委托和事件的作用

    委托

      可以把方法当参数传递,可以避免在程序中大量使用 if-else(switch) 语句,同时使得程序具有更好的可扩展性。C#2.0 之后出现了 匿名函数lambda表达式 也是 Delegate 演化而来。

    事件

      事件的使用一般通过发布者和订阅者来进行。发布者会在某一条件下触发某事件,订阅者可以通过订阅该事件,来对该事件的触发做出反应。

    • 在设计模式中的订阅者模式是最佳实践

    委托和事件的区别

    1、事件是委托的封装 —— 是一种特殊的委托。(初学时已经了解)

    2、事件里面其实就是两个方法(即 add_event()remove_event())和一个私有的委托变量,这两个方法里面分别是对这个私有的委托变量进行的合并和移除,当调用事件的 += 时其实是调用的事件里面的 add_event() 方法,同样 -= 调用的是 remove_event() 方法。

    3、在注册和注销事件上:
    委托可以使用 =+= 来将函数注册到委托的变量上,使用 -= 来将函数注销。
    事件则有着更严格的限制,事件只能使用 += 来将函数注册到其上,使用 -= 来将函数注销。

    委托和事件的详细解答请看C#系列文章

    CSharp(C#)语言_第十一章(委托)
    CSharp(C#)语言_第十二章(事件)

    委托和事件代码实践

    委托

    • “中国人和外国人问候” —— 经典面试题
    internal class Program
    {
        static void Main(string[] args)
        {
            CallDelegate("王二狗", SayChinese);
            CallDelegate("Tom", SayEnglish);
        }
    
        /// 
        /// 声明委托
        /// 
        /// 
        public delegate void DelegateSayHi(string name);
        /// 
        /// 声明委托调用方法
        /// 
        /// 
        /// 
        public static void CallDelegate(string name, DelegateSayHi sayHi) => sayHi(name);
    
        /// 
        /// 声明实现方法
        /// 
        /// 
        public static void SayChinese(string name)
        {
            Console.WriteLine($"你好,{name}");
        }
    
        /// 
        /// 声明实现方法
        /// 
        /// 
        public static void SayEnglish(string name)
        {
            Console.WriteLine($"Hello,{name}");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    委托实践

    事件

    • “猫叫、老鼠跑了,主人醒来了” —— 经典面试题
    internal class Program
    {
        static void Main(string[] args)
        {
            Mouse();
            People();
            Scream();
        }
    
        /// 
        /// 声明委托
        /// 
        public delegate void DelegateScream();
    
        /// 
        /// 声明事件
        /// 
        public static event DelegateScream OnScream;
    
        public static void Scream()
        {
            Console.WriteLine("猫叫了一声");
            OnScream?.Invoke();
        }
    
        public static void Mouse()
        {
            OnScream += () =>
            {
                Console.WriteLine("老鼠跑了");
            };
        }
    
        public static void People()
        {
            OnScream += () =>
            {
                Console.WriteLine("主人醒了");
            };
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    在这里插入图片描述

    总结

    事件是一种特殊的委托,事件的最佳实践为订阅者模式。委托可以将函数作为参数传递,消除了很多不必要的判断,增强了程序的健壮性和可扩展性。熟练并掌握委托和事件,有助我们写出更优雅、易读且性能优越的代码。

  • 相关阅读:
    Metasploit(MSF)使用
    stm32f407探索者开发板(二)——新建工程(基于固件库)
    基于STM32设计的智慧浇花系统(华为云IOT)
    OpenHarmony源码下载
    “深入探讨Java JUC中的ReentrantLock锁:实现多线程同步与并发控制“
    基于SSM的居家养老系统
    学习笔记1--自动驾驶系统架构
    博弈论 之 2 什么是博弈论
    软考-高级系统架构师复习知识点总结
    mybatispagehelp嵌套分页处理
  • 原文地址:https://blog.csdn.net/qq_43562262/article/details/127816246