【C#】委托和事件

目录

1.概念

2.自定义的委托

3.系统定义的委托

4.委托和事件的区别


1.概念

数组我们都知道是一组数据的容器,而委托很相似,不过它是一组函数的容器。

如果把调用一次函数看做释放一个技能,那调用一次委托则是释放一套技能连招

下面看看我们应该如何使用委托

2.自定义的委托以及其用法

using System.Runtime.Intrinsics.Arm;

namespace Delegate_Event
{
    //定义自定义委托
    //访问修饰默认不写为public在别的命名空间中也能使用
    //private其它命名空间就不能用了
    //一般使用public

    //声明一个无参数无返回值的委托容器
    public delegate void MyFun1();
    //声明一个有参数无返回值的委托容器
    public delegate void MyFun2(int val);
    //声明一个有参数有返回值的委托容器
    public delegate string MyFun3(int val);

    class Test
    {
        //用法一:在类中做参数
        MyFun1 fun1;
        MyFun2 fun2;


        //用法二:做参数
        public void TestFunc1(MyFun1 fun1, MyFun2 fun2)
        {
            this.fun1 = fun1;
            this.fun2 = fun2;
        }
        //用法三:做返回值
        public MyFun1 TestFunc2()
        {
            return this.fun1;
        }

    }
    internal class Program
    {
        static void Main(string[] args)
        {
            //委托容器只能装载与它声明时返回值和参数类型相同的函数
            //初始化方法一
            MyFun1 a1 = new MyFun1(Func1);
            MyFun2 b1= new MyFun2(Func2);
            MyFun3 c1 = new MyFun3(Func3);
            //初始化方法二
            MyFun1 a2 = Func1;
            MyFun2 b2 = Func2;
            MyFun3 c2 = Func3;
            //这时候我们只是创建好一些委托并初始化,但是还没有调用,因此控制台上看不到任何内容
            //调用方法如下
            //调用方法一
            a1.Invoke();
            b1.Invoke(1);
            c1.Invoke(2);
            //调用方法二
            a2();
            b2(11);
            c2(22);
            //之前在概念中我们提到,委托它是一组函数的集合,因此它应当能够添加更多的函数进来
            //添加或者删除函数方法如下
            a1 += Func1;
            b1 += Func2;
            c1 += Func3;
            //这时候a1,b1,c1里面都是存储了两个func函数,因此在调用一次它们时会调用两个对应函数
            //当然不是只能添加同一函数,只要参数和返回值类型相同的函数都可以添加
            a1 += Func11;

            //当委托里的一些函数我们不需要,需要删除函数时,方法如下
            a1 -= Func1;
            b1 -= Func2;
            c1-= Func3;
            //如果委托里的所有函数都不需要了,可以采用下面这样方法
            a2 = null;
            b2 = null;
            c2 = null;
            Console.WriteLine("------------------------");
            Test test = new Test();
            test.TestFunc1(Func1,Func2);
            test.TestFunc2();
        }

        static void Func1()
        {
            Console.WriteLine("无参数无返回值函数func1");
        }
        static void Func2(int a)
        {
            Console.WriteLine("有参数{0}无返回值函数func2",a);
        }
        static string Func3(int a)
        {
            Console.WriteLine("有参数{0}有返回值函数func3", a);
            return "我是Func3";
        }
        static void Func11()
        {
            Console.WriteLine("无参数无返回值函数func11");
        }
    }
}
    

3.系统定义的委托

像上面那种自定义委托,我们每需要一个新的委托类型时,就需要新声明一个委托类型,这样子不仅我们写起来很麻烦,而且当别人看我们写的代码时也会一头雾水——MyFun1到底是一个什么参数和返回值类型的委托?当我们看到很久以前自己写的代码,估计也会这样问。因此,接下来将介绍两种系统帮我们定义的委托类型

1.Action(无返回值类型)

参数可以根据需求选择添加,最多支持16个参数(一般用不到这么多),也就不足为虑尔

            //定义一个无参数无返回值类型的委托
            Action a;
            //定义一个有参数无返回值类型的委托
            Action<int> b;
            Action<int, string,int ,int> c;

2.Func(有返回值类型)

在传入的参数中,我们选择最后一个作为返回值类型,因此至少要传入一个参数

            //定义一个无参数有返回值类型的委托
            Func<int> d;
            //定义一个有参数有返回值类型的委托
            Action<int,int> e;
            Action<int, string, int, int> f;

4.委托和事件的区别

委托我们了解这么多了,那接下来该说说事件是什么,它们两个为什么会放在一起讲

事件其实就是特殊的委托

它特殊在哪里呢?且听我细细道来

首先声明方式不同:

        //声明委托
        Action a1;
        Func<int> b1;
        //声明事件
        event Action a2;
        event Func<int> b2;

需要在开头加上event

其次它们在使用上完全一致,没了

没了?????

怎么可能!!!!!!!!!!!

确实不可能,肯定还是有点略微的不同

1.事件不能在主函数中定义(它只能作为成员存在于类or接口or结构体中)

2.事件不能在类外部被赋值(+=和-=还是可以用滴)

3.事件不能在类外部被调用

ok,本文结束

博客得来终觉浅,绝知只能自己写,看完一定要动手敲一敲,不然等于没看。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_hhc_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值