• C#中的委托、事件与接口


    一、委托

    委托:将方法以变量的形式传递,以方法的形式执行
    注意:赋值方法的返回类型、参数要与委托的一致(如委托定义的参数类型是string,那么赋值的参数类型也要是string,并且参数个数要一样,委托的定义也是一样)

    详细解释:
    C#所有的委托派生自 System.Delegate 类,委托是存有对某个方法的引用的一种引用类型变量,委托变量可以当作另一个方法的参数来进行传递,实现事件和回调方法。有点类似C++中的函数指针,但是又有所不同。在C++中,函数指针不是类型安全的,它指向的是内存中的某一个位置,我们无法判断这个指针实际指向什么,对于参数和返回类型难以知晓。而C#的委托则完全不同,它是类型安全的,我们可以清晰的知道委托定义的返回类型和参数类型。

    namespace delegation
    {
        //定义一个有参数并且无返回值的委托
        public delegate void SayHelloDlg(string name);
        class Program
        {
            static void Main(string[] args)
            {
                //委托的声明
                SayHelloDlg dlg = SayHello;
                //委托的使用
                dlg("小朱");
                Console.ReadKey();
            }
    
            public static void SayHello(string name)
            {
                Console.WriteLine($"{name},你好呀!");
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    运行结果:
    在这里插入图片描述

    (一)委托链

    委托链会按照委托注册的顺序依次执行委托

    namespace delegation
    {
        //定义一个有参数并且无返回值的委托
        public delegate void SayHelloDlg(string name);
        class Program
        {
            static void Main(string[] args)
            {
                //委托的声明
                SayHelloDlg dlg = SayHello;
                
                //委托链
                dlg += SayGoodBye;
                
                //委托的使用
                dlg("小朱");
    
                Console.ReadKey();
    
            }
    
            public static void SayHello(string name)
            {
                Console.WriteLine($"{name},你好呀!");
            }
    
            public static void SayGoodBye(string name)
            {
                Console.WriteLine($"{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

    运行结果:
    在这里插入图片描述
    注意:

    Dlg += function  增加注册委托
    Dlg -= function  删除注册委托
    
    • 1
    • 2

    (二)匿名函数

    匿名函数:不用在下面生成一个独立的方法 如果只需要调用一次的话

    namespace delegation
    {
        //定义一个有参数并且无返回值的委托
        public delegate void SayHelloDlg(string name);
        class Program
        {
            static void Main(string[] args)
            {
    
                //匿名函数 不用在下面生成一个独立的方法 如果只需要调用一次的话
                SayHelloDlg dlg1 = delegate (string name)
                {
                    Console.WriteLine($"{name},我是匿名函数!");
                };
                //委托的使用
                dlg1("小朱");
                Console.ReadKey();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    (三)Lamda语句

    相对于匿名函数来说更加的简洁

    namespace delegation
    {
        //定义一个有参数并且无返回值的委托
        public delegate void SayHelloDlg(string name);
        class Program
        {
            static void Main(string[] args)
            {
                //Lamda语句
                SayHelloDlg dlg2 = (name) =>
                {
                    Console.WriteLine($"{name},我是Lamda语句!");
                };
                
                //委托的使用
                dlg2("小朱");
                Console.ReadKey();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    运行结果:
    在这里插入图片描述

    二、事件

    事件:(简单理解)一个被限制了的委托变量

    **详解:**委托相当于一系列函数的抽象类,这一系列函数要求拥有相同的参数和返回值;而事件(event)相当于委托的一个实例,事件是委托类型的成员,委托可以定义在类外面,而事件只能定义在类里面。

    namespace delegation
    {
        //定义一个有参数并且无返回值的委托
        public delegate void SayHelloDlg(string name);
        class Program
        {
            //声明事件
            public static event SayHelloDlg SayHelloEvent;
    
            static void Main(string[] args)
            {
    
                SayHelloEvent += Progame_SayHelloEvent;
                if (SayHelloEvent != null)
                    SayHelloEvent("小朱");
    
                Console.ReadKey();
    
            }
    
            public static void Progame_SayHelloEvent(string name)
            {
                Console.WriteLine($"{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

    三、接口

    接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 “是什么” 部分,派生类定义了语法合同 “怎么做” 部分。
    接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。

  • 相关阅读:
    文本直接生成20多种背景音乐,免费版Stable Audio来了!
    快消品行业供应商SRM云协同系统架构大数据战略,让平台数据价值最大化
    Gradle 使用maven本地仓库 带来的思考
    备份系统运行数据采集及分析方法
    python中的列表
    c++中的定位new表达式
    Latex双栏文章
    孩子用台灯哪种好用?热门好用的全新护眼台灯推荐
    非近轴衍射分束器的设计与严格分析
    TikTok营销策略 如何打造TikTok爆款视频?
  • 原文地址:https://blog.csdn.net/Z_hongli/article/details/127831765