`

委托:将方法绑定到委托

 
阅读更多

将方法绑定到委托

看到这里,是不是有那么点如梦初醒的感觉?于是,你是不是在想:在上面的例子中,我不一定要直接在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();
}

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    C#中委托和事件 方法的使用

    C# 中的委托和事件 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托、事件与Observer设计模式 Observer设计模式简介 实现范例的Observer设计模式 .Net Framework中的委托与事件

    事件.pdf(委托和事件有什么不同)

    /// 1:多播委托: 都是要+=或者-=的方式赋值 /// /// 事件的作用 /// 事件的作用于委托变量一样,只是功能上委托变了有更多的限制 /// 只能通过+=或者-=的方式,只能在类的内部调用事件 ///

    jQuery事件绑定和委托实例

    jQuery事件的绑定和委托可以用多种方法实现,on() 、 bind() 、 live() 、 delegate() ,还有one()。   有时我们可能会像下面这样绑定一个事件: 代码如下:$(“#div1”).click(function() {   alert(...

    C#委托,绑定方法.docx

    详解C#委托,事件,Observer设计模式

    详解C#委托,事件,Observer设计模式 1.将方法作为方法的参数 2.将方法绑定到委托 3.事件的由来 4.事件和委托的编译代码 5.委托、事件与Observer设计模式 6..Net Framework中的委托与事件

    XML数字签名技术的研究及在Java中的实现* (2006年)

    目的 分析研究XML签名的规范和特点,比较XML签名与传统签名的区别,探讨XML签名的具体实现方法及其应用领域。方法 通过对XML签名和验证的具体过程的研究,采用Java安全技术和Apache的xml-security安全套件,给出了一...

    C# 泛型委托示例 应用解析

    这是一个泛型委托的示例,主要是让初学者了解泛型委托的用法,虽然很简单,但是代码有注释,我的这个例子是在vs2010中做的,用vs08的朋友们,最好还是转一下,但是绝对能实现(本程序是控制台应用程序,适合初学者)...

    一个实用的C 委托库代码分享.rar

    源码包中还有对这个库的使用方法和文档的内容,包括:支持编译器和性能、声明形式的说明、构造函数说明、函数绑定(支持普通函数,仿函数,类成员函数,相同类型委托和委托中的元素)、判断绑定的函数个数、函数解...

    c#委托与事件实例讲解

    根据经典的实例,详细而全面的介绍了c#委托与事件,以及他们之间的关系

    socket网络通信,c++委托,绑定事件

    通过 c++ 的 FastDelegate FastDelegateBind 实现的委托,绑定 事件,包括服务器和客户端代码,并有演示demo

    javascript事件委托的方式绑定详解

    也许偶尔就会遇到“事件委托”,但是,大多数时说的是“事件绑定”,对于“事件委托”,或是不提,或是浅尝辄止。对于我这个比较好奇的人来说,实在很蛋疼。尤其是想更多的了解“事件委托”的时候。

    js事件on动态绑定数据,绑定多个事件的方法

    一.on(‘clcik’)与$(”).clcik()方法的区别: on(‘clcik’):事件委托机制 // 在body元素上绑定click事件处理函数handler,如果这个click事件是由其后代的P元素触发的,就执行handler...就执行祖辈元素上委托绑定的事

    事件绑定、事件监听、事件委托.pdf

    事件绑定、事件监听、事件委托.pdf

    JS 事件绑定、事件监听、事件委托详细介绍

    主要介绍了JS 事件绑定、事件监听、事件委托详细介绍的相关资料,需要的朋友可以参考下

    Bond:Swift绑定框架

    您可以将其用作独立的框架,以通过绑定和React式数据源简化状态更改,但也可以将其与ReactiveKit一起使用,以通过绑定,React式委托和React性数据源来补充React式数据流。 Bond是的骨干-首选与该框架一起使用的...

    C#委托示例,窗体之间传递数据例子,最简单的委托例子

    本人做的一个非常简单 C#委托的例子,很基础很简单的一个小例子,最最适合委托初学者参看。再结合资料,相信学通C#委托...委托很好的解决了窗体之间的数据传递和方法调用,非常实用,通过这个例子相信能让你恍然大悟。

    C# WebServices 动态绑定

    动态绑定服务器上的WebServices WebService委托机制

    JavaScript动态添加事件之事件委托

    先给大家讲下什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件。 也就是:...

    进度条.Lambda表达式.匿名方法.委托.类.集合.初始化

    进度条.Lambda表达式.匿名方法.委托.类.集合.初始化.容易懂

Global site tag (gtag.js) - Google Analytics