- 什么叫委托
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
定义完了后,举个例子来说明下,委托是如何使用得。先定义一个委托在用两个方法用来打招呼,
委托类型声明:
(1) 以deleagate关键字开头。
(2)返回类型+委托类型名+参数列表。
public delegate void GreedinDelegate(string name);
private static void SpeakEnglish(string name)
{
Console.WriteLine("good Morning," + name);
}
private static void SpeakChinese(string name)
{
Console.WriteLine("zao," + name);
}
private static void GreetPeople(string name, GreedinDelegate MakeGreeding)
{
MakeGreeding(name);
}
static void Main(string[] args)
{
GreetPeople("zang", SpeakEnglish);
GreetPeople("zeng", SpeakChinese);
Console.ReadLine();
}
知道委托是将方法作为参数来传递的。可以改进为
static void Main(string[] args)
{
GreedinDelegate d1, d2;
d1 = SpeakEnglish;
d2 = SpeakChinese;
GreetPeople("zhang", d1);
GreetPeople("zeng", d2);
Console.ReadLine();
}
运行结果同样。委托还有一个特性,可以将多个方法赋给同一个委托,或者叫将多个方法绑定到同一个委托,当调用这个委托的时候,将依次调用其所绑定的方法。将上述的例子修改如下
static void Main(string[] args)
{
GreedinDelegate d1;
d1 = SpeakEnglish;
d1 += SpeakChinese;
GreetPeople("zhang", d1);
Console.ReadLine();
}
输出结果
good Morning,zhang
zao,zhang
通过符号 += 将方法和委托绑定,反向 -= 可以将方法从委托上解绑。
static void Main(string[] args)
{
GreedinDelegate d1;
d1 = SpeakEnglish;
d1 += SpeakChinese;
GreetPeople("zhang", d1);
d1 -= SpeakChinese;
GreetPeople("zhang", d1);
Console.ReadLine();
}
结果
good Morning,zhang
zao,zhang
good Morning,zhang
- 事件 Event
在委托中,为了更好的操作,符合数据安全的原因,于是对委托进行封装,这就是事件。在类的内部,不管你声明它是public还是protected,它总是private的。在类的外部,注册“+=”和注销“-=”的访问限定符与你在声明事件时使用的访问符相同。声明一个事件不过类似于声明一个进行了封装的委托类型的变量。
将上面的例子修改下
public class GreetingManager
{
public event GreedinDelegate MakeGreet;
public void GreetPeople(string name)
{
MakeGreet(name);
}
}
class Program
{
private static void SpeakEnglish(string name)
{
Console.WriteLine("good Morning," + name);
}
private static void SpeakChinese(string name)
{
Console.WriteLine("zao," + name);
}
static void Main(string[] args)
{
GreetingManager gm = new GreetingManager();
gm.MakeGreet = SpeakEnglish;//这里编译报错,提示只能通过+=或者-=操作,这说明现在不能对这个进行赋值了。
gm.MakeGreet += SpeakChinese;
gm.GreetPeople("zhang");
}
}
结论:事件是委托的封装,也是委托。