C#中的委托事件与接口

Posted Z_hongli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中的委托事件与接口相关的知识,希望对你有一定的参考价值。

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,你好呀!");
        
    

运行结果:

(一)委托链

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

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,再见!");
        
    

运行结果:

注意:

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

(二)匿名函数

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

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

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

运行结果:

二、事件

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

**详解:**委托相当于一系列函数的抽象类,这一系列函数要求拥有相同的参数和返回值;而事件(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,我是一个事件!");
        

    

三、接口

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

以上是关于C#中的委托事件与接口的主要内容,如果未能解决你的问题,请参考以下文章

C#委托与事件

《精通C#》委托与事件(11.1-11.2)

C# 中的委托与事件

C# 中的委托与事件

快速理解C#中的委托与事件

C#中的委托是啥?事件是否一种委托?