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

一、委托

1. 概念:

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

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

C# 委托(Delegate)与事件(Event)、Func与Action_第1张图片

2. 使用

(1)定义委托

C# 委托(Delegate)与事件(Event)、Func与Action_第2张图片

 (2)定义方法

C# 委托(Delegate)与事件(Event)、Func与Action_第3张图片

(3)实例化委托并执行

C# 委托(Delegate)与事件(Event)、Func与Action_第4张图片

3. 补充

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

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

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

二、事件

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

C# 委托(Delegate)与事件(Event)、Func与Action_第5张图片

 C# 委托(Delegate)与事件(Event)、Func与Action_第6张图片

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

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

C# 委托(Delegate)与事件(Event)、Func与Action_第7张图片

 C# 委托(Delegate)与事件(Event)、Func与Action_第8张图片

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

 2. 声明:

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

C# 委托(Delegate)与事件(Event)、Func与Action_第9张图片

三、多播委托

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

C# 委托(Delegate)与事件(Event)、Func与Action_第10张图片

 

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

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

C# 委托(Delegate)与事件(Event)、Func与Action_第11张图片

C# 委托(Delegate)与事件(Event)、Func与Action_第12张图片 

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

C# 委托(Delegate)与事件(Event)、Func与Action_第13张图片

C# 委托(Delegate)与事件(Event)、Func与Action_第14张图片

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

C# 委托(Delegate)与事件(Event)、Func与Action_第15张图片

C# 委托(Delegate)与事件(Event)、Func与Action_第16张图片

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

C# 委托(Delegate)与事件(Event)、Func与Action_第17张图片   

 

你可能感兴趣的:(C#,基础知识,c#,开发语言,asp.net,.net,visual,studio)