码迷,mamicode.com
首页 > 其他好文 > 详细

委托和事件

时间:2015-05-14 18:20:12      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:

      委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

using System;
using System.Collections.Generic;
using System.Text;
namespace Delegate
{
//定义委托,它定义了可以代表的方法的类型
public delegate void GreetingDelegate(string name);
class Program
{
private static void EnglishGreeting(string name)
{
Console.WriteLine("Morning, " + name);
}
private static void ChineseGreeting(string name)
{
Console.WriteLine("早上好, " + name);
}
//注意此方法,它接受一个GreetingDelegate类型的参数,该参数是返回值为空,参数为string类型的方法
private static void GreetPeople(string name, GreetingDelegate MakeGreeting)
{
MakeGreeting(name);
}
static void Main(string[] args)
{
GreetPeople("Jimmy Zhang", EnglishGreeting);
GreetPeople("张子阳", ChineseGreeting);
Console.ReadKey();
}
}
}

输出:
Morning, Jimmy Zhang
早上好, 张子阳 

可以将多个方法赋给同一个委托,或者叫将多个方法绑定到同一个委托(多播委托)。当调用这个委托的时候,将依次调用其所绑定的方法。在这个例子中,语法如下:

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();
}
注意:这里,第一次用的“=”是赋值的语法;第二次用的“+=”是绑定的语法。第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误。
可以使用下面的代码来简化这一过程:
GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);
delegate1 += ChineseGreeting; // 给此委托变量再绑定一个方法
应该注意到这段代码第一条语句与实例化一个类何其相似,不禁想:上面第一次绑定委托时不可以使用“+=”的编译错误,或许可以用下面的方法来避免:
GreetingDelegate delegate1 = new GreetingDelegate();
delegate1 += EnglishGreeting; // 这次用的是 “+=”,绑定语法。
delegate1 += ChineseGreeting; // 给此委托变量再绑定一个方法
但实际会出现编译错误: “GreetingDelegate”方法没有采用“0”个参数的重载。尽管结果让人沮丧,但编译的提示:“没有0个参数的重载”再次让人联想到类的构造函数。再探个究竟之前,需要先把基础知识和应用介绍完。

委托和事件

标签:

原文地址:http://www.cnblogs.com/SmileX/p/4403048.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!