C#委托与事件初探
作者:网络转载 发布时间:[ 2016/2/18 10:25:18 ] 推荐标签:.NET 测试开发技术
近刚刚接触C#,学到事件与委托部分无法理解,于是上网查阅了各种资料,终于明白了一些,在此进行总结。
一.C语言中的函数指针
想要理解什么是委托,要先理解函数指针的概念。所谓函数指针,是指向函数的指针(等于没说-.-)。比如我定义了两个函数square和cube分别用于计算一个数的平方和立方,我再定义函数指针calcu,然后我让calcu指向square,那么调用calcu时相当于调用了square函数(注意,此处函数指针接受的参数类型及个数要与函数一致)。很好理解吧?不多说,上代码。
1 #include <stdio.h> 2 3 void square(int x) { printf("square of %d is %d ",x,x*x); } 4 void cube(int x) { printf("cube of %d is %d ",x,x*x*x); } 5 6 int main() 7 { 8 void (*calcu)(int x); 9 calcu=square; 10 calcu(2); 11 12 return 0; 13 }
二.C#中委托的实质
委托又名委托类型,为什么C#弄出这个东西?因为C#是一门比较安全的语言,不允许操作指针,于是我们不能定义函数指针。但想要达到相同的效果,于是定义了委托类型。所谓委托类型,其本质是C中的指针类型。于是代码变成了这样:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Delegate 8 { 9 class Program 10 { 11 static void square(int x) { Console.WriteLine("square of {0} is {1}", x, x * x); } 12 static void cube(int x) { Console.WriteLine("cube of {0} is {1}", x, x * x * x); } 13 14 delegate void math(int x); //定义委托类型 15 16 static void Main(string[] args) 17 { 18 math calcu; 19 calcu += square; 20 calcu(2); 21 Console.ReadKey(); 22 } 23 } 24 }
可以看出,定义委托类型math实际上相当于定义了void*类型。而委托类型实例化得到的calcu实际上是函数指针。(说句题外话:定义函数(方法)时要加上static是因为调用函数时并未实例化,只有静态方法能够直接通过类调用)。
三.委托的使用方法
我们在上述代码19行后面加上一行代码 calcu+=cube; 运行会发现,square和cube均被调用。可以看出,符号 += 表示绑定方法到委托变量,同理符号 -= 表示取消绑定。可以理解为calcu是void **类型,即它指向了一个数组,数组中的每一项都是函数指针类型,每次调用calcu时,遍历此数组,即依次调用每个绑定的方法。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11