C#.Net中委托的简单应用

来源 :学问·科教探索 | 被引量 : 0次 | 上传用户:kingworsebest
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  【摘要】本文介绍了Visual C#.NET中委托的基本概念、实例化、委托的调用,着重介绍了使委托来引用静态方法和非静态方法、将方法绑定到委托、取消对方法的绑定,以期能为实际开发带来具体参考价值。
  【关键词】Visual C#.NET;.Net Framework;委托;绑定;方法
  
  1.引言
  
  委托在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了。本文中,我将通过一个范例由浅入深地讲述什么是委托、委托的简单应用。
  
  2.委托的概念及定义
  
  .Net的MSDN关于委托的定义是:delegate 声明定义一种引用类型,该类型可用于将方法用特定的签名封装。委托实例封装静态方法或实例方法。委托大致类似于 C++ 中的函数指针;但是,委托是类型安全和可靠的。
  Delegate实际上是一个abstract class(Delegate派生于System.MulticastDelegate, System.MulticastDelegate又派生于System.Delegate),所以可以在任何地方定义Delegate,可以在class类内部,也可以在类外部;还可以在命名空间中把委托定义为顶层对象。根据定义的可见性,可以在委托定义上添加一般的访问修饰符:public、 private和 protected等。
  委托是可保存对方法的引用的类。与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委托就等效于一个类型安全函数指针或一个回调。虽然委托具有许多其他的用途,但这里只讨论委托实例封装静态方法或实例方法。一个委托声明足以定义一个委托类。声明提供委托的签名,公共语言运行库提供实现。
  如何理解Delegate的类型安全特性?跟C++的函数指针相比。函数指针只不过是指向存储区的一个指针,无法说出这个指针实际指向什么东西,更别说想获取参数(parameter)和返回值(return value)之类的数据了。而delegate定义时必须指定它所代表的方法的所有细节,比如参数类型,个数以及返回值等等;C#中创建委托使用delegate关键字,委托名可以是任何你认为有意义的词。但必须使你的委托匹配你想指向的方法的签名。当C#的编译器处理委托类型时,会自动地生成一个密封(sealed)类。
  
  3.委托的简单应用—可以封装静态方法也可以封装实例方法
  
  我们先不管这个标题如何的绕口,也不管委托究竟是个什么东西,来看下面这个简单的例子:
  using System;
  namespace DelegateExample{
  public delegate void ArithmeticDelegate(int x, int y); //声明委托
  class DelegateClass{
   //定义了可以被委托类型ArithmeticDelegate封装的Add实例方法,它和委托有相同签名
  public void Add(int x, int y){
  Console.WriteLine("Start Add:{0} +{1}={2}", x, y, x + y);
  }
  //可以被委托类型ArithmeticDelegate封装的Sub静态方法,它和委托有相同签名
  public static void Sub(int x, int y){
  Console.WriteLine("Start Sub:{0}-{1}={2}", x, y, x - y);
  }
  static void Main(string[] args){
  DelegateClass objTest = new DelegateClass();
  //委托实例化,并指明其封装的实例方法Add。
   ArithmeticDelegate delegateAdd = new ArithmeticDelegate(objTest.Add);
   delegateAdd(2, 3);//委托的调用,实质上运行的是Add(2,3)方法
  //委托实例化,并指明其封装的静态方法Sub。
   ArithmeticDelegate delegateSub = new ArithmeticDelegate(DelegateClass.Sub);
  delegateSub(2, 3); //委托的调用, 实质上运行的是Sub(2,3)方法
  ArithmeticDelegate d1 = null;
  //给此委托变量d1先后绑定Add方法和Sub方法
  d1 += delegateAdd;
  d1 += delegateSub;
  d1(22, 33);
  //取消对Sub方法的绑定
  d1 -= delegateSub;
  d1(222, 333);
  }
  }
  }
  输出结果如下:
  Start Add:2 +3=5
  Start Sub:2-3=-1
  Start Add:22 +33=55
  Start Sub:22-33=-11
  Start Add:222 +333=555
  代码分析:
  【1】、声明委托
  声明委托的格式:
  <修饰符号> delegate (argument list)
  如:public delegate void ArithmeticDelegate(int x, int y);
   声明一个新的委托类型。每个委托类型都描述参数的数目和类型,以及它可以封装的方法的返回值类型。每当需要一组新的参数类型或新的返回值类型时,都必须声明一个新的委托类型。
  【2】、实例化委托
   声明了委托类型后,必须创建委托对象并使之与特定方法关联。与所有其他对象类似,新的委托对象用 new 表达式创建。但创建委托时,传递给 new 表达式的参数很特殊:它的编写类似于方法调用,但没有方法的参数。
  如:
   ArithmeticDelegate delegateSub = new ArithmeticDelegate(DelegateClass.Sub);
  创建与静态方法Sub关联的新的委托对象。
  又如:ArithmeticDelegate delegateAdd = new ArithmeticDelegate(objTest.Add);;
  创建与对象DelegateClass.objTest 上的非静态方法Add关联的新的委托对象。请注意一旦创建了委托,它所关联到的方法便永不改变:委托对象不可改变。
  【3】、调用委托
   创建委托对象后,通常将委托对象传递给将调用该委托的其他代码。通过委托对象的名称(后面跟着要传递给委托的参数,括在括号内)调用委托对象。
  如delegateAdd(2, 3),实质上运行的是Add(2,3)方法
  【4】将方法绑定到委托
   使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。
  如:ArithmeticDelegate d1 = null;
  d1 += delegateAdd;
  d1 += delegateSub;
  d1(22, 33);
   委托变量d1先后绑定Add方法和Sub方法,在运行d1(22, 33)时,其实相当于,先后运行Add(22,33),Sub(22,33);
  【5】取消对方法的绑定
  既然给委托可以绑定一个方法,语法是+=那么也应该有办法取消对方法的绑定,很容易想到,这个语法是“-=”:
  如:ArithmeticDelegate d1 = null;
   d1 += delegateAdd;
  d1 += delegateSub;
  d1 -= delegateSub;
  此时的委托变量d1其实只封装了Add方法了。
   我们现在对委托做一个总结:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
   委托应用的步骤:先声明委托,再实例化并指明所代具体方法,然后再调用委托。
  
  4.结束语
  
   本文首先引用委托的概念,然后通过一个小程序向大家介绍委托的声明、委托的实例化、委托的调用及委托的绑定和取消委托的绑定。最后总结委托的应用步骤。
  
  【参考文献】
  [1]谢云著.Visual C# 2005程序设计基础与实例教程.研究出版社,2008.2.
  [2]里克特 著.Microsoft .NET 框架程序设计(修订版)[M].李建忠.北京:清华大学出版社,2003.11.
  [3]Microsoft著.C#程序设计语言.高等教育出版社.2003.8
  
  作者简介:朱小兵(1978--),男,本科,计算机专业,老师
  【责任编辑:王利强】
其他文献
【摘要】以往的教学要求学生做好课前预习,课堂上在讲解激素调节与动物行为这部分内容时,主要是围绕动物的繁殖行为;而对于神经调节与动物行为这部分内容主要是通过列表来比较动物的先天性行为和后天下行为。虽然也是经过了认真的备课,然而课堂效果却并不尽人意,感到课堂上师生都缺少激情,仿佛一道菜中缺少了调味剂,很是乏味!那么,用什么方式能够使学生在活跃的课堂气氛中轻松的掌握知识?通过实践证明,运用多媒体以及大量
期刊
【摘要】以苏州园林为代表的江南古典园林在中国的古典园林史特别是古典私家园林史上具有举轻重中的地位。江南有灵秀的山川,氤氲的气候,物华天宝,人杰地灵,园林之美盛极,成为中国园林美学的实践例证。本文主要阐述了江南园林的美学营造方面杰出的成就及对当今景观设计的启示。  【关键词】江南古典园林;美学特点;启示    一.园林的起源与发展    中国古代园林起源于古代帝王的囿,距今已3000多年的历史。据考
期刊
【摘要】本文通过对简·奥斯汀以及夏洛蒂·勃朗特的作品中的女性人物的爱情观与婚姻观的分析,试图分析女性作家本人的爱情观与婚姻观。并探讨了这些观点的现实意义。  【关键词】女性作家;爱情;婚姻    在整个英国文学史中,涌现出了许多优秀的女性文学作家,她们通过自己的作品,用女性特有的细腻的情感和细致的描写,向世界宣告着她们自己的思想。她们的作品涉及到社会生活的各个方面,她们的思想也渗透到了社会生活的各
期刊
【摘要】地理概念是深入学习地理规律和原理的重要基础,直接关系到地理教学质量的提高。本文从概念教学的原理出发,通过分析地理概念的涵义和分类,引发出对地理概念教学思考,并进一步阐述了有关地理概念教学方法及教学策略。  【关键词】概念;地理概念;教学方法;教学策略    一、地理概念的涵义    (一)概念的涵义  概念是从日常经验中抽象出来的,它不是指特定的事例,而是一组事例的某种抽象特征。通过概念,
期刊
【摘要】Blog作为一种有效的知识管理工具,越来越受到教育工作者的关注,并被引入到教学领域。本文在分析Blog及其特点的基础上,阐述了Blog在教育中都有哪些应用。  【关键词】Blog;教学;应用    博客(blog)已经成为一种继课件、积件、资源库、教育主题网站等信息化教学模式之后,一种新的网络应用模式。网上博客(Blog)的兴起及其在互联网与传媒整合时代的发展,都在实践着一种新的思维方式、
期刊
【摘要】农村家长大多由于自身文化素质不高,对家庭教育的认识不够,对家庭教育普遍存在误解,加上教育方法过于极端化,导致农村家庭教育功能严重弱化,缺失,以及针对这些失误所提出的应对方法。  【关键词】农村家庭教育;失误;应对方法;和谐;成功     著名教育家苏霍姆林斯基说:“父母是创造未来的“雕塑家”,儿童的“基石”是由父母双手奠定的,教育好自己的子女是一个公民的基本义务”。在当今社会,所有家长都望
期刊
【摘要】有兴趣就有作文的动力,作文教学应注意激发兴趣,优化学生习作心境和指导过程,让学生“心有所思,情有所感,而后有所写”,进而形成良好的智能、情感、个性品质。  【关键词】优化;心境;情感;个性    有兴趣就有作文的动力,因此,作文教学应该注意激发兴趣,优化学生习作心境,优化作文指导过程,让学生“心有所思,情有所感,而后有所写”,进而形成良好的智能、情感、个性品质。近几年来,我在高年级作文教学
期刊
【摘要】2008北京奥运会的成功举办,使我国大众体育参与意识空前高涨。河北省环抱北京,其大众体育发展,受奥运影响较深。以奥运为契机,解决好河北省现存的大众体育发展的问题,必将使我省的大众体育发展迈上一个新的台阶。  【关键词】北京奥运;河北;大众体育    竞技可以展现体育的魅力,然而体育不仅仅是赛场之争。正如现代奥运会创始人顾拜旦所说:“体育为大众”。民众更广泛地参与体育活动,不仅是奥林匹克运动
期刊
【摘要】2007年春季Sun发布了一个新的框架,叫做JavaFX,本文旨在对该新技术的起源、特点、现状、优势向读者作一个简要的介绍。  【关键词】JavaFX;RIA;富客户端;Web    引言:    今天的Internet为那些能够快速开发、部署富Internet应用(RIAs)的开发商提供了无限可能的世界。但只有Java平台称得上在移动设备和浏览器领域非常流行,将使用RIAs的基于浏览器的
期刊
【摘要】介绍了自行设计的恒压供水系统,采用PLC进行逻辑控制,采用变频器进行压力调节.变频器、可编程控制器作为系统控制的核心部件,时刻跟踪管网压力与给定压力的偏差变化,经变频器内部PID运算,通过可编程控制器控制变频与工频切换,自动控制水泵投入的台数和电机转速,实现闭环自动调节恒压变量供水,在保持恒压下达到控制流量的目的,运行结果表明,该系统具有压力稳定,结构简单,工作可靠等特点。  【关键词】P
期刊