一、委托
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<> : 系统定义的委托,通常使用事件声明来使用
说明:关于以下两种声明和调用方式的使用,看个人习惯,对不同的人,各有优势。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)