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},我是一个事件!");
        }

    }
}

三、接口

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

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值