- 浏览: 183410 次
- 性别:
- 来自: 深圳
文章分类
最新评论
将方法绑定到委托
看到这里,是不是有那么点如梦初醒的感觉?于是,你是不是在想:在上面的例子中,我不一定要直接在GreetPeople()方法中给 name参数赋值,我可以像这样使用变量:
而既然委托GreetingDelegate 和 类型 string 的地位一样,都是定义了一种参数类型,那么,我是不是也可以这么使用委托?
如你所料,这样是没有问题的,程序一如预料的那样输出。这里,我想说的是委托不同于string的一个特性:可以将多个方法赋给同一个委托,或者叫将多个方法绑定到同一个委托,当调用这个委托的时候,将依次调用其所绑定的方法。在这个例子中,语法如下:
输出为:
Morning, Jimmy Zhang
早上好, Jimmy Zhang
实际上,我们可以也可以绕过GreetPeople方法,通过委托来直接调用EnglishGreeting和ChineseGreeting:
NOTE:这在本例中是没有问题的,但回头看下上面GreetPeople()的定义,在它之中可以做一些对于EnglshihGreeting和ChineseGreeting来说都需要进行的工作,为了简便我做了省略。
注意这里,第一次用的“=”,是赋值的语法;第二次,用的是“+=”,是绑定的语法。如果第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误。
我们也可以使用下面的代码来这样简化这一过程:
GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);
delegate1 += ChineseGreeting; // 给此委托变量再绑定一个方法
看到这里,应该注意到,这段代码第一条语句与实例化一个类是何其的相似,你不禁想到:上面第一次绑定委托时不可以使用“+=”的编译错误,或许可以用这样的方法来避免:
GreetingDelegate delegate1 = new GreetingDelegate();
delegate1 += EnglishGreeting; // 这次用的是 “+=”,绑定语法。
delegate1 += ChineseGreeting; // 给此委托变量再绑定一个方法
但实际上,这样会出现编译错误: “GreetingDelegate”方法没有采用“0”个参数的重载。尽管这样的结果让我们觉得有点沮丧,但是编译的提示:“没有0个参数的重载”再次让我们联想到了类的构造函数。我知道你一定按捺不住想探个究竟,但再此之前,我们需要先把基础知识和应用介绍完。
既然给委托可以绑定一个方法,那么也应该有办法取消对方法的绑定,很容易想到,这个语法是“-=”:
输出为:
Morning, Jimmy Zhang
早上好, Jimmy Zhang
早上好, 张子阳
让我们再次对委托作个总结:
使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。
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();
}
static void Main(string[] args) {
GreetingDelegate delegate1;
delegate1 = EnglishGreeting; // 先给委托类型的变量赋值
delegate1 += ChineseGreeting; // 给此委托变量再绑定一个方法
// 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
delegate1 ("Jimmy Zhang");
Console.ReadKey();
}
static void Main(string[] args) {
GreetingDelegate delegate1;
delegate1 = EnglishGreeting; // 先给委托类型的变量赋值
delegate1 += ChineseGreeting; // 给此委托变量再绑定一个方法
// 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
GreetPeople("Jimmy Zhang", delegate1);
Console.ReadKey();
}
static void Main(string[] args) {
GreetingDelegate delegate1, delegate2;
delegate1 = EnglishGreeting;
delegate2 = ChineseGreeting;
GreetPeople("Jimmy Zhang", delegate1);
GreetPeople("张子阳", delegate2);
Console.ReadKey();
}
static void Main(string[] args) {
string name1, name2;
name1 = "Jimmy Zhang";
name2 = "张子阳";
GreetPeople(name1, EnglishGreeting);
GreetPeople(name2, ChineseGreeting);
Console.ReadKey();
}
发表评论
文章已被作者锁定,不允许评论。
-
使用SignalR构建一个最基本的web聊天室
2015-01-06 15:09 728使用SignalR,可以使用服务器消息推送到客户端,件demo ... -
Cookie小知识
2014-12-17 11:02 559如果cookie设置了过期时间,cookie就会保存在硬盘中 ... -
远程服务器返回错误: (500) 内部服务器错误 (解决方案)
2013-12-19 18:00 14008“/”应用程序中的服务器错误。 远程服务器返回错误: ... -
C# 的异步get 的三种方法
2013-06-21 16:04 929using System;using System.Colle ... -
ado.net 连接池相关知识
2013-01-27 20:07 810using System;using System.Coll ... -
c# 验证码生成与使用
2012-10-07 14:37 871---生成验证码的类 using System;using ... -
多线程的理解
2012-09-21 00:31 677什么是多线程:多线程就是“同时”可以执行多个任务,实际上并不是 ... -
委托:委托、事件与Observer设计模式
2012-09-20 23:10 891上面的例子已不足以再进行下面的讲解了,我们来看一个新的范例,因 ... -
委托:将方法做为方法的参数
2012-09-20 22:51 699引言 委托 和 事件在 .Net Framework中的应用 ... -
C#,FTP上传的代码 FtpWebRequest
2012-08-24 22:46 926private void Upload(string file ... -
c#之冒泡法与快速法排序
2012-08-08 22:10 710设计页面labe1 ,label2 ,label5分 ... -
C#中数组类型的相互转换
2012-08-08 22:11 1422string数组类型转换为int数组.方法一:Con ... -
C#中基类和派生类的构造函数以及变量的执行顺序整理
2012-04-04 22:54 1062Code highlighting produced by A ... -
时间处理类
2012-03-01 11:10 694/// <summary> /// ... -
DropDownList 小知识
2011-12-03 10:24 816给DropDownList 绑定值后,如果要默认选中其中一个 ... -
列表最后一行加小计或总计 ——小总结
2011-11-30 16:56 17361.所有分页的总计 protec ... -
无法加载协定为“tt.WeatherWebServiceSoap”的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分。
2011-11-22 22:08 3757无法加载协定为“tt.WeatherWebServiceSoa ... -
一个天气预报的webservice
2011-11-21 20:45 991http://www.webxml.com.cn/WebSer ... -
asp.net 页面生成html页面 方法二
2011-11-15 22:53 945protected override void Render ... -
asp.net 页面生成html页面 方法一
2011-11-15 22:43 831这是个方法 private bool CreateList( ...
相关推荐
C# 中的委托和事件 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托、事件与Observer设计模式 Observer设计模式简介 实现范例的Observer设计模式 .Net Framework中的委托与事件
/// 1:多播委托: 都是要+=或者-=的方式赋值 /// /// 事件的作用 /// 事件的作用于委托变量一样,只是功能上委托变了有更多的限制 /// 只能通过+=或者-=的方式,只能在类的内部调用事件 ///
jQuery事件的绑定和委托可以用多种方法实现,on() 、 bind() 、 live() 、 delegate() ,还有one()。 有时我们可能会像下面这样绑定一个事件: 代码如下:$(“#div1”).click(function() { alert(...
。
详解C#委托,事件,Observer设计模式 1.将方法作为方法的参数 2.将方法绑定到委托 3.事件的由来 4.事件和委托的编译代码 5.委托、事件与Observer设计模式 6..Net Framework中的委托与事件
目的 分析研究XML签名的规范和特点,比较XML签名与传统签名的区别,探讨XML签名的具体实现方法及其应用领域。方法 通过对XML签名和验证的具体过程的研究,采用Java安全技术和Apache的xml-security安全套件,给出了一...
这是一个泛型委托的示例,主要是让初学者了解泛型委托的用法,虽然很简单,但是代码有注释,我的这个例子是在vs2010中做的,用vs08的朋友们,最好还是转一下,但是绝对能实现(本程序是控制台应用程序,适合初学者)...
源码包中还有对这个库的使用方法和文档的内容,包括:支持编译器和性能、声明形式的说明、构造函数说明、函数绑定(支持普通函数,仿函数,类成员函数,相同类型委托和委托中的元素)、判断绑定的函数个数、函数解...
根据经典的实例,详细而全面的介绍了c#委托与事件,以及他们之间的关系
通过 c++ 的 FastDelegate FastDelegateBind 实现的委托,绑定 事件,包括服务器和客户端代码,并有演示demo
也许偶尔就会遇到“事件委托”,但是,大多数时说的是“事件绑定”,对于“事件委托”,或是不提,或是浅尝辄止。对于我这个比较好奇的人来说,实在很蛋疼。尤其是想更多的了解“事件委托”的时候。
一.on(‘clcik’)与$(”).clcik()方法的区别: on(‘clcik’):事件委托机制 // 在body元素上绑定click事件处理函数handler,如果这个click事件是由其后代的P元素触发的,就执行handler...就执行祖辈元素上委托绑定的事
事件绑定、事件监听、事件委托.pdf
主要介绍了JS 事件绑定、事件监听、事件委托详细介绍的相关资料,需要的朋友可以参考下
您可以将其用作独立的框架,以通过绑定和React式数据源简化状态更改,但也可以将其与ReactiveKit一起使用,以通过绑定,React式委托和React性数据源来补充React式数据流。 Bond是的骨干-首选与该框架一起使用的...
本人做的一个非常简单 C#委托的例子,很基础很简单的一个小例子,最最适合委托初学者参看。再结合资料,相信学通C#委托...委托很好的解决了窗体之间的数据传递和方法调用,非常实用,通过这个例子相信能让你恍然大悟。
动态绑定服务器上的WebServices WebService委托机制
先给大家讲下什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件。 也就是:...
进度条.Lambda表达式.匿名方法.委托.类.集合.初始化.容易懂