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

C#中delegate的作用

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
学习c#都会惊奇于它的delegate,其实delegate并没有太多神秘的地方,说的通俗点,delegate是类型化了的函数指针,它主要应用于回调。

学习c++的对函数指针都不回陌生,它是一个保存了函数地址的变量,但除了地址,它没有包含任何额外的信息,如参数的个数、参数类型和函数的返回地址等,所以函数指针是非类型安全的。而delegate对回调提供了类型的安全性,从而使我们在处理回调等问题的时候可以更加优美的面向对象的方式来编写代码,并且在CLR的内部对delegate的操作提供了许多支持(如delegate链表),简化了我们常用的操作。

   在使用delegate的过程中,首先要定义一个delegate的类型,如:

    public delegate void SomeFunction(Object a,int i,...);

    note:它是一个类的定义,可以放在任何地方,此类型定义了此delegate所接收的函数的样式:返回void,参数列表...

   然后,为了使用,要定义类SomeFunction的一个实例:

    public SomeFunction instance;

    接着,我们就可以往这个delegate实例中放“符合规范”的函数(可以为实例函数和静态函数)。

  instance +=new SomeFunction(someObject.SomeMethod);

   其中someObject为某类的一个实例,它的方面SomeMethod符合此委托的规范要求,否则将编译报错。

 最后,可以直接调用instance实例来实现对someObject的SomeMethod的回调。

  instance(...);

 ##########################

只是从上面的实现中,貌似看不出delegate真正存在的价值,但实际上delegate增加了对链的支持,我们可以象下面这样应用:

 instance +=new SomeFunction(someObject.SomeMethod);

 instance +=new SomeFunction(anotherObject.anotherMethod);

...

然后调用instance(...),可以同时激发所有注册自里面的回调函数。

这是怎样实现的,首先要研究delegate内在的结构,在每个delegate里面包括了三个字段:

 target  ——》指向回调函数所属的对象实例(对于实例方法来言)

 method ——》指向回调函数

 prev ——》指向另外一个delegate 实例

通过prev就可以比较方便的实现delegate对链的支持。

CLR定义了Delegate.Combine和Delegate.Remove静态方法实现对链表的操作。

 

注:本文转载 

 


鲜花

握手

雷人

路过

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

请发表评论

全部评论

专题导读
上一篇:
.net数据库操作类(C#)——V2.0发布时间:2022-07-10
下一篇:
C#生成随机字符串(数字,字母,特殊符号)发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

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

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

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