.NET--第4部分_第1页
.NET--第4部分_第2页
.NET--第4部分_第3页
.NET--第4部分_第4页
.NET--第4部分_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第一部分是Microsoft.NET框架的基本原理,第二部分是类型和公共语言运行时,第三部分是类型设计,第四部分是基本类型,第五部分是类型管理,第四部分是基本类型,文本处理,枚举类型和位标记数组接口,定制特性,第17章,委托,事件驱动,和17.1委托,这是一个新的面向对象的语言特性。基于委托开发事件驱动的应用程序非常容易。通过灵活使用委托。NET框架设计了一个异步编程框架,这使得程序员可以方便地开发具有多线程特性的应用程序。委托在。NET框架基础类库。佣金到底是什么?我们都熟悉常用数据类型(如int)的用法:首先定义一个变量,然后给它赋值,如下所示:int I;/定义变量i=100;/dele

2、gate也可以被视为一种数据类型,并可以用来定义变量。但是,它是一种特殊的数据类型,由它定义的变量只能接收一个函数。更准确地说,委托类型变量可以接收函数的地址,这与C/C语言中的函数指针非常相似。简而言之,委托变量可以被视为类型安全的函数指针,并且它只能接收满足其要求的函数引用。17.1.1理解委托的概念,公共类数学选择公共int add (int变元1,int变元2)返回变元1变元2;公共委托int MathOptDelegate(int值1,int值2);类程序静态空主(字符串参数)MathOptDelegate对象;MathOpt obj=new MathOpt();oppDel=obj

3、。添加;控制台。WriteLine(oppDel(1,2);/输出3/控制台。read key();从上面的例子中,我们可以得到一个直观的印象,委托可以被看作是一个函数的“容器”。特定函数“加载”后,它可以用作函数。实际上,委托是从委托派生的类,但是从使用的角度来看,它可以被理解为一个函数“容器”。那么,所有的函数都可以分配给委托类型的变量delegate吗?注意MathOptDelegate的定义语句:公共委托int Mathoptdelegate (int值1,int值2);它规定委托类型变量只能接收具有两个int类型参数的函数,返回值类型也是int。任何满足上述要求的函数,不管其名称是静

4、态的还是实例的,都可以传递给委托类型变量oppDel,并且可以通过oppDel“间接”调用它们。定义委托类型时对函数的要求称为函数的“签名”。函数的签名指定了参数的数量和类型以及函数的返回值,这体现了函数的基本特征。每个委托决定一个函数的签名。具有不同签名的函数不能被分配给相同类型的委托变量。13.1.2委托的组合和分解,委托不仅可以代表一个函数,还可以组合一串函数,然后分批执行它们。下面的示例2显示了委托变量之间的组合和分解。委托void MyDelegate(字符串s);我的类公共静态空你好(字符串)控制台WriteLine(您好,0!s);公共静态空再见控制台WriteLine(再见,0

5、!s);类程序静态空主(字符串参数)我的委托a、b、c、d;/创建引用你好方法的委托对象a a=我的班级。你好。控制台WriteLine(调用委托变量a :);a(a);/创建引用再见方法的委托对象b b=我的班级.再见。控制台WriteLine(调用委托变量b :);b(b);请仔细看以下代码:/a和b两个委托合成c,c=a b;控制台WriteLine(调用委托变量c :);c(c=a b);/c将按顺序调用两个方法/从组合委托c中移除a,只留下b,用d代表移除结果,d=c-a;控制台WriteLine(调用委托变量d :);d(d=c-a);/后者仅调用再见方法:控制台读取密钥();上述

6、代码中委托变量c组合了两个委托变量a和b,因而,它拥有两个函数,当执行 c( c=a b );时,将导致我的班级类的两个静态函数都被执行。像c这样的委托变量又称为多路委托变量“。可以用加法运算符来组合单个委托变量为多路委托变量。也可以使用减法运算符从一个多路委托变量中移除某个委托变量。上述示例2运行结果为* 17。1 .3委托揭秘,编译器和CLR怎样来实现委托?使用ildasm查看示例1月()方法的代码:静态void Main(字符串参数)MathOptDelegate OppDelMathOpt obj=new MathOpt();对象.添加;控制台WriteLine(oppDel(1,2)

7、;/输出3注意:通过委托变量间接调用对象obj的实例方法添加(),实际上调用的是MathOptDelegate类的调用()方法。这个调用()方法从何而来?委托定义语句:公共委托int MathOptDelegate(int值1,int值2);当编译器遇到这段代码时,它会产生如下面所示的一个完整的类定义:公共类MathOptDelegate :系统。多播委派公共MathOptDelegate(对象目标,国际号码32方法指针);公共无效虚拟调用(国际号码32值1,国际号码32值2);公共虚拟iasyncresultbegininvoke(int 32值1,int 32值2,AsyncCallbac

8、k,Object对象);公共虚拟void EndInvoke(IAsyncResult结果);委托定义语句:公共委托int MathOptDelegate(int值1,int值2);当编译器遇到这段代码时,它会产生如下面所示的一个完整的类定义:公共类MathOptDelegate :系统。多播委派公共MathOptDelegate(对象目标,国际号码32方法指针);公共无效虚拟调用(国际号码32值1,国际号码32值2);公共虚拟iasyncresultbegininvoke(int 32值1,int 32值2,AsyncCallback,Object对象);公共虚拟void EndInvoke

9、(IAsyncResult结果);类的构造器,它接收两个参数目标和方法。目标:引用要调用方法的对象;方法:是一个方法指针,代表要调用的对象方法你好。委托定义语句:公共委托int MathOptDelegate(int值1,int值2);当编译器遇到这段代码时,它会产生如下面所示的一个完整的类定义:公共类MathOptDelegate :系统。多播委派公共MathOptDelegate(对象目标,国际号码32方法指针);公共无效虚拟调用(国际号码32值1,国际号码32值2);公共虚拟iasyncresultbegininvoke(int 32值1,int 32值2,AsyncCallback,O

10、bject对象);公共虚拟void EndInvoke(IAsyncResult结果);方法和源代码中指定的原型一样。对外界对象实例方法的调用通过调用()方法实现。,委托定义语句:公共委托int math optdelegate (int值1,int值2);当编译器遇到此代码时,它将生成一个完整的类定义,如下所示:公共类Mathoptdelegate : System。多播委托公共数学委托(对象目标,Int32方法指针);公共无效虚拟调用(Int32值1,Int32值2);公共虚拟iasyncresultbegininvoke(int 32 value 1,Int32 value2,Async

11、Callback,Object对象);公共虚拟void EndInvoke(IAsyncResult结果);用于实现异步调用。编译器定义的类中有四种方法:构造函数、调用、开始和结束。MathOptDelegate类的方法都是虚拟方法,对应的方法IL代码为空。以Invoke()方法为例,生成的IL代码如下(通过ILDasm查看):通过签名新槽虚拟实例int 32 invoke (int 32值1,int 32 value 2)runtime managed/end of methoopt delegate : invoke c #编译器为委托类型生成的所有方法体都是空的!该标志告诉CLR,该方法

12、的指令将在运行时动态生成。17.1.4委托调用链,自定义委托实际上是从MulticastDelegate类派生的。委托类代表委托基类,而多播委托类代表多播委托。这意味着从委托类派生的委托只能用一个函数“加载”,而从多播委托类派生的委托可以用多个函数“加载”,这些函数作为“委托调用链表”首尾相连,并包含在多个委托变量中(见下图)。实际上,C#编译器将我们定义的所有委托类型都视为从多播委托派生的。示例3介绍了“委托调用链”的含义。首先,定义了一个委托类型MyDelegate和一个类A公共委托int mydelegate (int值)。公共类公共接口控制台。WriteLine(f1.i=0,I);返回I;公共int F2(int I)I *=2;控制台。WriteLine(f2.i=0,I);返回I;类中的两个方法都符合由MyDelegate委托确定的函数签名。创建对象a: a a=新a();创建第一个委托变量S1我的委托S1=新的我的委托(f1);s1=新的MyDelegate(a . F2);在委托类中有一个静态方法GetInvocationList(),用于获取委托调用链,通过它可以知道有多少方法是由多个委托变量组

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论