`

委托:将方法绑定到委托

 
阅读更多

将方法绑定到委托

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

分享到:
评论
发表评论

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

相关推荐

    委托例子:自定义委托,泛型委托,多播委托,

    委托在.NET框架中扮演着重要的角色,它是类型安全的函数指针,允许我们传递方法作为参数,或者将多个方法绑定到一个事件上。本示例是基于VS2015编译环境,主要展示了自定义委托、泛型委托以及多播委托的使用。 **一...

    C#委托概念的理解和示例

    委托在C#中是一种类型安全的函数指针,它允许将方法作为参数传递。相比于C语言中的函数指针,C#中的委托具备面向对象的特点,同时也确保了类型安全性和安全性。 #### 二、委托的组成部分 理解委托的基本组成部分有...

    委托的使用方法

    在.NET框架中,委托是一种类型安全的函数指针,它允许我们传递方法作为参数,或者将方法连接起来形成事件处理链。在C#中,委托是通过关键字`delegate`来定义的,它实际上是一个类,这个类封装了一个或多个方法的调用...

    C#委托,绑定方法.docx

    在C#编程语言中,委托是一种强大的特性,它允许我们将方法作为参数传递给其他方法,从而实现高度灵活的代码设计。在上述文档中,讨论了如何使用委托来改进一个简单的问候语程序,使其能够支持多语言环境,同时保持...

    C#委托 C#委托 C#委托

    然后,我们可以实例化这个委托类型,并将其绑定到某个方法: ```csharp MathOperation add = new MathOperation(Add); ``` 其中,`Add`是一个符合`MathOperation`签名的方法。 ### 3. 委托的多播 C#委托支持多播...

    对C#委托及事件委托的理解

    - **组合委托:**使用`+`运算符将两个委托组合在一起。 - **删除委托:**使用`-`运算符从组合委托中删除某个委托。 - **空委托处理:**如果一个委托为空(即`null`),则在尝试调用时会抛出异常。 #### 六、总结 ...

    C#控件委托类库

    2. 使用委托:声明并实例化类库提供的委托类型,然后将要执行的方法绑定到委托。 3. 调用控件扩展方法:在控件实例上调用扩展方法,将委托传递给它,从而设置事件处理。 4. 管理事件:根据需要订阅和取消订阅事件,...

    layui动态绑定事件的方法

    本文将介绍使用layui框架来实现动态绑定事件的方法,并探讨其中的关键技术点。 首先,我们需要了解动态创建DOM元素后,原有的事件绑定可能不会生效。这是因为事件监听器是在元素创建时就绑定的,而对于后来添加到...

    vb.net 最简单的理解委托

    在VB.NET中,我们可以使用`AddressOf`运算符将方法与委托关联起来。例如,假设我们有以下方法: ```vb.net Sub PrintMessage(ByVal message As String) Console.WriteLine(message) End Sub ``` 现在,我们可以...

    C#使用委托(delegate)实现在两个form之间传递数据的方法

    在C#编程中,委托(Delegate)是一种类型安全的函数指针,允许我们将方法作为参数传递给其他方法,或者存储在变量中以便稍后调用。这种机制在处理事件处理和跨对象通信时非常有用,特别是在需要在多个Form之间传递...

    委托传方法案例委托传方法案例

    这可以通过使用`+`运算符将方法添加到委托实例中,或使用`-`运算符移除方法: ```csharp void AnotherPrintMessage(string message) { Console.WriteLine("Another: " + message); } myDel += ...

    c#委托和事件教程,委托事件教程

    - 在C#中,委托允许我们传递方法作为参数,或者将方法存储在变量中。这样,我们可以在运行时动态地决定执行哪个方法。 - 由于委托是类型安全的,它们提供了比C/C++函数指针更强大的功能,同时避免了类型不匹配的...

    C#委托实现窗体间传值

    - 绑定委托:在源窗体中,创建委托实例并将方法绑定到它,然后在适当的时候调用。 ``` ValueTransfer transferDelegate = new ValueTransfer(SendValueToForm); transferDelegate.Invoke(someValue); ``` 4. *...

    c#委托与事件实例讲解

    这种设计模式允许我们将方法作为参数传递给其他方法,或者存储在数据结构中,以便稍后调用。这为实现回调和事件处理提供了基础。 委托的声明类似于函数原型,它定义了返回类型和参数列表。使用`delegate`关键字来...

    深入浅出委托与事件的描述

    - 当我们使用`+=`操作符将事件处理程序(如`button1_Click`)添加到事件时,实际上是将方法绑定到委托上。这样,当事件发生时,就会自动调用这个方法。 - `System.EventHandler`是连接事件和事件处理程序的桥梁,...

    C#移除所有事件绑定的方法

    事件是基于委托的,而委托本质上是一种多播代理,可以链接多个方法。以下是一个简单的事件声明和订阅示例: ```csharp private delegate int DEL_TEST_EventHandler(int m, int n); private event DEL_TEST_...

    C#委托示例 委托和事件

    3. **将方法绑定到委托**: 可以使用`+=`操作符将方法绑定到委托,或者使用`= new DelegateType()`来直接初始化。 ```csharp myDelegate = new MyDelegate(ShowMessage); myDelegate += ShowMessage; ``` 4. **调用...

    C# 通过委托和线程实现chart控件的实时更新

    委托可以用来将方法作为参数传递给其他方法,或者返回方法的结果。在我们的示例代码中,我们定义了一个名为 BindData 的委托,该委托具有三个参数:DataSet Dt、DataSet Dt1 和 int style。该委托将被用来将数据绑定...

    c# 委托、父窗体传值到子窗体,DEMO,完整源码

    在C#编程中,委托是一种强大的工具,它允许我们传递方法作为参数,或者将多个方法绑定到一个事件处理程序上。在这个"父窗体传值到子窗体,DEMO"中,我们可以深入理解委托如何在窗口之间的通信中起到关键作用。这个...

    C# 委托和事件 (详细讲解)

    委托允许我们将方法作为参数传递给其他方法,或者存储在一个变量中以便稍后调用,这种特性使得委托成为函数式编程的一种工具。 1. **声明委托** 定义一个委托就像定义一个方法签名一样,使用`delegate`关键字。...

Global site tag (gtag.js) - Google Analytics