网络编程
位置:首页>> 网络编程>> ASP.NET>> C#中的委托和事件(2)

C#中的委托和事件(2)

作者:JimmyZiYang 来源:蓝色理想 发布时间:2007-09-26 20:50:00 

标签:c#,委托,事件

将方法绑定到委托

看到这里,是不是有那么点如梦初醒的感觉?于是,你是不是在想:在上面的例子中,我不一定要直接在GreetPeople()方法中给 name参数赋值,我可以像这样使用变量:


static void Main(string[] args) {
       string name1, name2;
       name1 = "Jimmy Zhang";
       name2 = "张子阳";

       GreetPeople(name1, EnglishGreeting);
       GreetPeople(name2, ChineseGreeting);
       Console.ReadKey();
}


而既然委托GreetingDelegate 和 类型 string 的地位一样,都是定义了一种参数类型,那么,我是不是也可以这么使用委托?


static void Main(string[] args) {
       GreetingDelegate delegate1, delegate2;
       delegate1 = EnglishGreeting;
       delegate2 = ChineseGreeting;

       GreetPeople("Jimmy Zhang", delegate1);
       GreetPeople("张子阳", delegate2);
       Console.ReadKey();
}


如你所料,这样是没有问题的,程序一如预料的那样输出。这里,我想说的是委托不同于string的一个特性:可以将多个方法赋给同一个委托,或者叫将多个方法绑定到同一个委托,当调用这个委托的时候,将依次调用其所绑定的方法。在这个例子中,语法如下:


static void Main(string[] args) {
       GreetingDelegate delegate1;
       delegate1 = EnglishGreeting;     // 先给委托类型的变量赋值
       delegate1 += ChineseGreeting;     // 给此委托变量再绑定一个方法

       // 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
       GreetPeople("Jimmy Zhang", delegate1);      
       Console.ReadKey();
}


输出为:
Morning, Jimmy Zhang
早上好, Jimmy Zhang

实际上,我们可以也可以绕过GreetPeople方法,通过委托来直接调用EnglishGreeting和ChineseGreeting:


static void Main(string[] args) {
       GreetingDelegate delegate1;
       delegate1 = EnglishGreeting;     // 先给委托类型的变量赋值
       delegate1 += ChineseGreeting;     // 给此委托变量再绑定一个方法

       // 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
       delegate1 ("Jimmy Zhang");      
       Console.ReadKey();
}


NOTE:这在本例中是没有问题的,但回头看下上面GreetPeople()的定义,在它之中可以做一些对于EnglshihGreeting和ChineseGreeting来说都需要进行的工作,为了简便我做了省略。

注意这里,第一次用的“=”,是赋值的语法;第二次,用的是“+=”,是绑定的语法。如果第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误。

我们也可以使用下面的代码来这样简化这一过程:


GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);
delegate1 += ChineseGreeting;       // 给此委托变量再绑定一个方法


看到这里,应该注意到,这段代码第一条语句与实例化一个类是何其的相似,你不禁想到:上面第一次绑定委托时不可以使用“+=”的编译错误,或许可以用这样的方法来避免:


GreetingDelegate delegate1 = new GreetingDelegate();
delegate1 += EnglishGreeting;       // 这次用的是 “+=”,绑定语法。
delegate1 += ChineseGreeting;       // 给此委托变量再绑定一个方法


但实际上,这样会出现编译错误: “GreetingDelegate”方法没有采用“0”个参数的重载。尽管这样的结果让我们觉得有点沮丧,但是编译的提示:“没有0个参数的重载”再次让我们联想到了类的构造函数。我知道你一定按捺不住想探个究竟,但再此之前,我们需要先把基础知识和应用介绍完。

既然给委托可以绑定一个方法,那么也应该有办法取消对方法的绑定,很容易想到,这个语法是“-=”:


static void Main(string[] args) {
       GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);
       delegate1 += ChineseGreeting;    // 给此委托变量再绑定一个方法

       // 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
       GreetPeople("Jimmy Zhang", delegate1);      
       Console.WriteLine();

       delegate1 -= EnglishGreeting; //取消对EnglishGreeting方法的绑定
       // 将仅调用 ChineseGreeting
       GreetPeople("张子阳", delegate1);      
       Console.ReadKey();
}


输出为:
Morning, Jimmy Zhang
早上好, Jimmy Zhang

早上好, 张子阳

让我们再次对委托作个总结

使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。

0
投稿

猜你喜欢

  • 好多网友问起来,·深度学习网址导航·深度学习整站系统 的后台管理能否增加批量删除功能,如何加:就是列出N篇文章或网址信息,每篇文章或网址前有
  • 一、连接MYSQL:格式: mysql -h主机地址 -u用户名 -p用户密码1、例1:连接到本机上的MYSQL。首先在打开DOS窗口,然后
  • 这问题在网络相信已经有不少人问到,最近再次被牵起讨论,籍此记录一下个人的理解,border:none;与border:0;的区别体现有两点:
  • 装了 Access 2003 安全更新 (KB981716) 之后 Access 打不开,office2003-KB981716-FullF
  • 文章主要描述的是SQL Server聚集索引的指示(Cluster Index Indications),在实际操作中借助聚集索引来进行搜索
  • 两年前,我们开发了一套基于Flash的文件(主要是图片)上传RIA应用,提供给阿里巴巴的用户使用。如果你使用过Wordpress或flick
  • 没什么说的,就是生成随机数而已!!相关文章推荐:8个asp生成随机字符的函数<% Function gen_key(digi
  • select 终极美化,主要是针对下拉框的美化一个很古老的话题了,不过貌似目前为止也没有比较好的做到,在jxdawei的基础上做了
  • 假如你正在运行使用MySQL的Web应用程序,那么你把密码或者其他敏感信息保存在应用程序里的机会就很大。保护这些数据免受黑客或者窥探者的获取
  • SQL Server 6.5作为面向中小型企业的网络数据库服务系统,提供了 与众多高级数据库管理器相同的运行性能,向传统的数据库厂商发起了强
  • 随着十几年前“用户体验”这一概念的提出,“用户研究”也逐渐发展成为一个新兴的行业。那么,“用户研究”究竟包括哪些工作内容,在企业中如何开展,
  • 一个js用星投票的例子,不是常见的图片版,当然你如果会点js代码的话应该可以改为更加美观的图片投票,原理都一样。本程序只演示了读取星的个数,
  • 学习目的: 学习ADO.NET用法,并如何用DataRearder读取数据 今天练习数据库的最基本用法,如何打开数据库。首先在网站设置文件w
  • 成为一个顶级设计师的第一准则:限制你的字体让你成为设计大的七个基本原则之一好~设计大师,或者也太吹牛了吧,但根据下面七个基本原则至少你可以成
  • MySQL的Explain命令用于查看执行效果。虽然这个命令只能搭配select类型语句使用,如果你想查看update,delete类型语句
  • 代理服务是一种复杂的技术,具有很多可配置的移动组件。详细信息如下:信息信息是指在服务代理应用程序中调用的基本信息单元。对于服务代理来说,信息
  • 下表列出 SQL Server 查询分析器提供的所有键盘快捷方式。活动 快捷方式 书签:清除所有书签。 CTRL-SHIFT-F2
  •  <% Function ReplaceUrl2(HTMLstr) Dim n,st
  • 问题1:使用.net2005自带的SQL-Express连接不上。解决方法:1.网络防火墙阻止数据库连接;2.默认SQL-Express没有
  • ajax缓存和编码问题不难解决,下面是解决方法。编码问题默认使用UTF-8,如果一旦发现对象找不到的情况,可能js中输入了中文,同时js的编
手机版 网络编程 asp之家 www.aspxhome.com