- 浏览: 189155 次
- 性别:
- 来自: 深圳
文章分类
最新评论
将方法绑定到委托
看到这里,是不是有那么点如梦初醒的感觉?于是,你是不是在想:在上面的例子中,我不一定要直接在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 765使用SignalR,可以使用服务器消息推送到客户端,件demo ... -
Cookie小知识
2014-12-17 11:02 598如果cookie设置了过期时间,cookie就会保存在硬盘中 ... -
远程服务器返回错误: (500) 内部服务器错误 (解决方案)
2013-12-19 18:00 14176“/”应用程序中的服务器错误。 远程服务器返回错误: ... -
C# 的异步get 的三种方法
2013-06-21 16:04 964using System;using System.Colle ... -
ado.net 连接池相关知识
2013-01-27 20:07 839using System;using System.Coll ... -
c# 验证码生成与使用
2012-10-07 14:37 908---生成验证码的类 using System;using ... -
多线程的理解
2012-09-21 00:31 719什么是多线程:多线程就是“同时”可以执行多个任务,实际上并不是 ... -
委托:委托、事件与Observer设计模式
2012-09-20 23:10 946上面的例子已不足以再进行下面的讲解了,我们来看一个新的范例,因 ... -
委托:将方法做为方法的参数
2012-09-20 22:51 731引言 委托 和 事件在 .Net Framework中的应用 ... -
C#,FTP上传的代码 FtpWebRequest
2012-08-24 22:46 961private void Upload(string file ... -
c#之冒泡法与快速法排序
2012-08-08 22:10 741设计页面labe1 ,label2 ,label5分 ... -
C#中数组类型的相互转换
2012-08-08 22:11 1540string数组类型转换为int数组.方法一:Con ... -
C#中基类和派生类的构造函数以及变量的执行顺序整理
2012-04-04 22:54 1097Code highlighting produced by A ... -
时间处理类
2012-03-01 11:10 725/// <summary> /// ... -
DropDownList 小知识
2011-12-03 10:24 853给DropDownList 绑定值后,如果要默认选中其中一个 ... -
列表最后一行加小计或总计 ——小总结
2011-11-30 16:56 17681.所有分页的总计 protec ... -
无法加载协定为“tt.WeatherWebServiceSoap”的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分。
2011-11-22 22:08 3824无法加载协定为“tt.WeatherWebServiceSoa ... -
一个天气预报的webservice
2011-11-21 20:45 1046http://www.webxml.com.cn/WebSer ... -
asp.net 页面生成html页面 方法二
2011-11-15 22:53 979protected override void Render ... -
asp.net 页面生成html页面 方法一
2011-11-15 22:43 864这是个方法 private bool CreateList( ...
相关推荐
委托在.NET框架中扮演着重要的角色,它是类型安全的函数指针,允许我们传递方法作为参数,或者将多个方法绑定到一个事件上。本示例是基于VS2015编译环境,主要展示了自定义委托、泛型委托以及多播委托的使用。 **一...
委托在C#中是一种类型安全的函数指针,它允许将方法作为参数传递。相比于C语言中的函数指针,C#中的委托具备面向对象的特点,同时也确保了类型安全性和安全性。 #### 二、委托的组成部分 理解委托的基本组成部分有...
在.NET框架中,委托是一种类型安全的函数指针,它允许我们传递方法作为参数,或者将方法连接起来形成事件处理链。在C#中,委托是通过关键字`delegate`来定义的,它实际上是一个类,这个类封装了一个或多个方法的调用...
在C#编程语言中,委托是一种强大的特性,它允许我们将方法作为参数传递给其他方法,从而实现高度灵活的代码设计。在上述文档中,讨论了如何使用委托来改进一个简单的问候语程序,使其能够支持多语言环境,同时保持...
然后,我们可以实例化这个委托类型,并将其绑定到某个方法: ```csharp MathOperation add = new MathOperation(Add); ``` 其中,`Add`是一个符合`MathOperation`签名的方法。 ### 3. 委托的多播 C#委托支持多播...
- **组合委托:**使用`+`运算符将两个委托组合在一起。 - **删除委托:**使用`-`运算符从组合委托中删除某个委托。 - **空委托处理:**如果一个委托为空(即`null`),则在尝试调用时会抛出异常。 #### 六、总结 ...
2. 使用委托:声明并实例化类库提供的委托类型,然后将要执行的方法绑定到委托。 3. 调用控件扩展方法:在控件实例上调用扩展方法,将委托传递给它,从而设置事件处理。 4. 管理事件:根据需要订阅和取消订阅事件,...
本文将介绍使用layui框架来实现动态绑定事件的方法,并探讨其中的关键技术点。 首先,我们需要了解动态创建DOM元素后,原有的事件绑定可能不会生效。这是因为事件监听器是在元素创建时就绑定的,而对于后来添加到...
在VB.NET中,我们可以使用`AddressOf`运算符将方法与委托关联起来。例如,假设我们有以下方法: ```vb.net Sub PrintMessage(ByVal message As String) Console.WriteLine(message) End Sub ``` 现在,我们可以...
在C#编程中,委托(Delegate)是一种类型安全的函数指针,允许我们将方法作为参数传递给其他方法,或者存储在变量中以便稍后调用。这种机制在处理事件处理和跨对象通信时非常有用,特别是在需要在多个Form之间传递...
这可以通过使用`+`运算符将方法添加到委托实例中,或使用`-`运算符移除方法: ```csharp void AnotherPrintMessage(string message) { Console.WriteLine("Another: " + message); } myDel += ...
- 在C#中,委托允许我们传递方法作为参数,或者将方法存储在变量中。这样,我们可以在运行时动态地决定执行哪个方法。 - 由于委托是类型安全的,它们提供了比C/C++函数指针更强大的功能,同时避免了类型不匹配的...
- 绑定委托:在源窗体中,创建委托实例并将方法绑定到它,然后在适当的时候调用。 ``` ValueTransfer transferDelegate = new ValueTransfer(SendValueToForm); transferDelegate.Invoke(someValue); ``` 4. *...
这种设计模式允许我们将方法作为参数传递给其他方法,或者存储在数据结构中,以便稍后调用。这为实现回调和事件处理提供了基础。 委托的声明类似于函数原型,它定义了返回类型和参数列表。使用`delegate`关键字来...
- 当我们使用`+=`操作符将事件处理程序(如`button1_Click`)添加到事件时,实际上是将方法绑定到委托上。这样,当事件发生时,就会自动调用这个方法。 - `System.EventHandler`是连接事件和事件处理程序的桥梁,...
事件是基于委托的,而委托本质上是一种多播代理,可以链接多个方法。以下是一个简单的事件声明和订阅示例: ```csharp private delegate int DEL_TEST_EventHandler(int m, int n); private event DEL_TEST_...
3. **将方法绑定到委托**: 可以使用`+=`操作符将方法绑定到委托,或者使用`= new DelegateType()`来直接初始化。 ```csharp myDelegate = new MyDelegate(ShowMessage); myDelegate += ShowMessage; ``` 4. **调用...
委托可以用来将方法作为参数传递给其他方法,或者返回方法的结果。在我们的示例代码中,我们定义了一个名为 BindData 的委托,该委托具有三个参数:DataSet Dt、DataSet Dt1 和 int style。该委托将被用来将数据绑定...
在C#编程中,委托是一种强大的工具,它允许我们传递方法作为参数,或者将多个方法绑定到一个事件处理程序上。在这个"父窗体传值到子窗体,DEMO"中,我们可以深入理解委托如何在窗口之间的通信中起到关键作用。这个...
委托允许我们将方法作为参数传递给其他方法,或者存储在一个变量中以便稍后调用,这种特性使得委托成为函数式编程的一种工具。 1. **声明委托** 定义一个委托就像定义一个方法签名一样,使用`delegate`关键字。...