在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
前一次进行字符串统计的Individual Project 中用到了委托,感觉十分方便,在这里进行一下简单介绍。 历史上Windows API经常使用C语言风格的函数指针来创建称为回调函数或简称为回调的实体。【回调(callback)一词本身指的是可以作为参数传给其他代码的一段可执行代码。普通调用往往是高层代码(如应用程序)去调用处在低层的函数(如系统函数、库函数)。而回调时,则是在低层函数执行时调用高层代码。】使用回调,程序员可以使一个函数返回报告给程序中的另一个函数。C风格回调函数问题在于,它们除了提供原始内存地址外无法表示其他信息。而我们希望回调中应该包含更多的类型安全信息,如参数数量和类型、所指向方法的返回值。为达到这一要求,在.NET FRAMEWORK 里,使用了更为安全和面向对象的委托来实现回调。 委托是一个类型安全的对象,它指向程序中另一个(或多个)以后会被调用的方法。委托包含3个重要信息:
例如我们定义一个名为IntCalc的委托: public delegate int IntCalc(int x,int y) 它可以指向任何输入两个整数返回一个整数的方法。当用C#处理委托类型时,它会自动产生一个派生自System.MulticastDelegate的密封类,这个类与它的基类System.Delegate一起为委托提供必要的基础设施,以维护以后要调用方法的列表。 C#委托定义生成的密封类有三个编译器生成的方法,这三个方法的参数和返回值基于委托的声明,伪代码如下: Public sealed Class DelegateName: System.MulticastDelegate { public DelegateName (object target,uint functionAddress); public delegateReturnValue Invoke(allDelegateInputRefAndOutParams); public IAsynResult BeginInvoke(allDelegateInputRefAndOutParams,AsynCallback cb,object state); public delegateReturnValue EndInvoke(allDelegateInputRefAndOutParams,IAsyncResult result); } 由于上述几个函数涉及多线程调用,本人对此不甚了解,不再赘述。 相对于这些原理性的东西,相信大家更加关心的是委托的用法,这一点在http://baike.baidu.com/view/1935199.htm 中有非常详细且通俗的讲解。 对于委托的用法,我还要补充两点。一是匿名方法,一是Lamda表达式。 由于一些方法很少被调用委托之外的任何程序调用,从生产效率的角度来说,手工定义一个由委托对象调用的方法有点繁琐。为解决这一情况,可以在事件注册时直接将一个委托与一段代码相关联,这种代码的正式名称是匿名方法。如下例: 已经定义了public delegate int IntCalc(int x,int y) 我们可以这样进行注册 IntCalc cal =new IntCalc( delegate(int x , int y){ return x + y};); 匿名方法可以使我们访问定义它们的方法的局部变量,这些局部变量称为匿名方法的外部变量。 如 int t; IntCalc cal = delegate(int x , int y){ return x * y*t}; Lamda表达式提供了更为简单的匿名方法注册方式,彻底简化了对.NET委托类型的使用。 Lamda表达式是这样编写的,首先定义一个参数列表,“=>”标记紧随其后,然后就是表达式。表达式可以理解为:ArgumentToProcess => StatesToProcessThem. 上述委托注册可以写为 IntCalc cal =new IntCalc( ( x, y)=>(x+y)); 委托可以在泛型中得到广泛应用,利用委托,我们可以自定义大小比较、匹配等的规则,从而可以很方便的调用List自带函数,免去许多不必要的麻烦,大大提高编程效率。 (部分内容摘自Pro C# 2008 .NET 3.5Platform中文翻译版) |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论