• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

C#中的委托用法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

  前一次进行字符串统计的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中文翻译版)


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#Json总结发布时间:2022-07-13
下一篇:
复习一下基础:'C# 值类型和引用类型 以及作为方法参数的区别' ...发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap