这几天一直在纠结 委托与事件是怎么一样的关系和区别,先看看在什么情况下产生的委托。经常我们会遇到这样的问题,就是要在不同的时候调用不同的方法。
例:向人打招呼这个方法
public void GetPeople(string name)
{
English(name);
}
//国外人打招呼
static void English(string name)
{
Console.WriteLine("Good mornning {0}",name);
}
当我还要增加其它国家的时候,我们可以要修改GetPeople()方法,如加个中国人打招呼,我们就要做
public void GetPeople(string name,Lang lang)
{
switch (lang)
{
case Lang.china:
china(name);
break;
case Lang.english:
english(name);
break;
default:
break;
}
}
//加一个枚举类型,来判断调用的是那一个方法
public enum Lang
{
china,english
}
//外国人打招呼
static void English(string name)
{
Console.writeLine("Good mornning {0}",name);
}
//中国人打招呼
static void China(string name)
{
Console.WriteLine("早上好 {0}",name);
}
这样是解决了问题,但是如果还要增加方法的话,扩展性是不是很差呢。那有没有像传递string name一样才传递方法呢,传递的时候,给这个参数进行赋值。像这样
public void GetPeople(string name,*** Markmeeting)
{
Markmeeting(name);//它指向的就是一个方法
}
这时候委托就差生了。把方法注册到委托上面(把方法加到委托,像变量赋值一样)。
委托声明格式如下:
public delegate void MarkmeetingDelegate(string name);//delegate 为关键字, void 为返回值, string name为参数,这样就确定了能注册到它上面的方法,应该满足这样条件。
public MarkmeetingDelegate Markeeting;
public void GetPeople(string name,MarkmeetingDelegate Markeeting)
{
Markeeting(name);
}
//委托
public delegate void MarkmeetingDelegate(string name);
在上面的代码中我们是不是看到了这样的一个效果,Public MarkeetingDelegate Markeeting 像不像我们定义类的时候的一个字段呢。字段一般定义为private ,这样用户就不能随便的对其进行操作。对于委托我们也是一样的操作。将委托声明为private的。
如何操作私有的委托呢,这时候就产生了事件。事件就是对委托的一个封装一样的。像类中的属性有点类似。
public event MarkeetingDelegate Markeeting;//用事件对委托进行封装。这时省略写法。
public void GetPeople(string name,MarkmeetingDelegate Markeeting)
{
Markeeting(name);
}
//委托
public delegate void MarkmeetingDelegate(string name);
public event MarkeetingDelegate Markeeting;进行反编译的时候,我们可以看到编译器帮我们生成了一个
private MarkGreetDelegate mark;
[MethodImpl(MethodImplOptions.Synchronized)] public void add_mark(MarkGreetDelegate value) { this.mark = (MarkGreetDelegate) Delegate.Combine(this.mark, value); }
|
Ok了现在明白了委托和事件吗。加油,加油,这就是我对事件和委托的理解,不对之处,还请指出。