委托 编辑词条
关联知识
关闭

引言

  委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

委托初识

  我们知道委托是一个引用类型,所以它具有引用类型所具有的通性。它保存的不是实际值,而是保存对存储在托管堆(managed heap)中的对象的引用。那它保存的是对什么的引用呢?委托保存的是对函数(function)的引用。

  对学过C/C++的人,是不是觉得跟函数指针很像呢!委托可以引用实例和静态(在 Visual Basic 中为 Shared)方法,而函数指针只能引用静态(在 Visual Basic 中为 Shared)方法。 其实它们是有区别的,在非托管C/C++中,函数的地址就是一个内存地址。该地址不会携带任何额外的信息,例如函数期望的参数个数、参数类型、函数的返回值类型及函数的调用约定。总之,非托管C/C++中函数指针是非类型安全的。而.NET中的委托是类型安全的,委托会检测它所保存的函数引用是否和声明的委托匹配。

委托本质

  在C#中使用delegate关键字定义委托,然后使用我们熟悉的函数调用的语法来调用委托,如上述例子中的cb(“skynet”,23)。在这简单的表象背后,.NET编译器为我们做了什么呢?

  可以知道定义CallBack委托时,编译器为我们做了如下工作,实际上定义任何委托编译器都会做如下工作:

  声明一个类,对应上图中的.class nested public auto ansi sealed。

  该类扩展自System.MulticastDelegate,对应上图中的extends [mscorlib]System.MulticastDelegate。

  该类包含一个构造器,对应上图中的.ctor: void(object ,native int)。

  该类包含三个方法,分别是BeginInvoke、EndInvoke、Invoke。

委托类

  当我们用delegate关键字声明委托时,编译器自动为我们生成类。类的名字即为委托变量名,访问类型为定义的委托访问类型。如上例中,public delegate void CallBack(string name, int number);定义的委托对应的类为CallBack,访问类型为public,该类继承自[mscorlib]System.MulticastDelegate。如果我们定义委托的访问类型为private或者protected,则对应的委托类的访问类型为private或者protected。但是任何委托都继承自[mscorlib]System.MulticastDelegate。

  什么是委托

  首先要知道什么是委托,用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西。

  如何使用委托

  在使用委托的时候,你可以像对待一个类一样对待它。即先声明,再实例化。只是有点不同,类在实例化之后叫对象或实例,但委托在实例化后仍叫委托。


0 支持 词条对我有帮助

免责声明:本站法规文件转自:政府网、政报、媒体等公开出版物对文本的真实性、准确性和合法性,请核对正式出版物、原件和来源。

相关课程:
无相关课程
 
相关书籍:
无相关书籍
 
参考资料:
 
解释原文:
注:如果不填则默认为对全文进行解释
参考资料:
对应网址:
 
开放分类: 我来补充
 
相关词条:
无相关词条
 
相关问题: 我要提问
无相关问题
 
评论: 参与评论
发表评论

 

点击刷新