C# 委托(Delegate)与事件(Event)、Func与Action

一、委托

1. 概念:

        从内存角度看,委托是一个存储方法的容器,当使用该容器时,会把容器里面的方法全部执行一遍,容器里面的方法可增(+=)可减(-=)。

        从IL(Microsoft中间语言)角度看,委托是一个类(class),使用new关键字实例化,并需要传递一个参数,参数为方法名称。

2. 使用

(1)定义委托

 (2)定义方法

(3)实例化委托并执行

3. 补充

(1)委托里面存储的方法可以是静态方法也可以是非静态的方法。

(2)当声明的委托包含返回值时,不能直接调用Invoke方法,否则只会得到最后一个方法的结果。

(3)定义委托与定义方法相比,一是没有方法体,二是用多了delegate修饰。

二、事件

1. 概念:事件是一个受限制的委托变量。如何理解呢,先看以下关于委托的使用代码:

 

 这里我们能看到,在类MyDelegateClass中声明的委托,既可以在当前内中被执行,也可以在其他类中被执行,还可以在其他类中重新赋值后在被调用执行。

接下来我们看看用事件声明的情况:

 

 这里我们看到声明事件其实就是在声明委托变量的条件下,只用了个event修饰而已,即myDelegate现在是一个事件变量,而不是一个委托变量了,我们发现它仍然能在当前类中被执行,但是在另外一个类中,既不能被直接调用执行,也不能被重新赋值了,只能通过+=或-=来增减函数。这就是事件存在的必要,因为事件的这两个限制条件,在某种程度上会更安全。

 2. 声明:

在声明委托的基础上,使用event关键字修饰

三、多播委托

1. 概念:存储了不止一个方法的委托就是多播委托。

 

四、实际开发中常用的系统提供的委托和事件

(1)Func<> : 这是系统定义的带有返回值的委托,泛型中的最后一个类型一定是返回值类型,前面所有的都是参数类型,可以传入多个参数。

 

(2)Action<> : 这是系统定义的不带返回值的委托,泛型中的所有数据类型都是参数类型。

(3)EventHandler<> :  系统定义的委托,通常使用事件声明来使用

说明:关于以下两种声明和调用方式的使用,看个人习惯,对不同的人,各有优势。

   

 

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Supper_Demo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值