委托与事件的理解

来源:互联网 发布:网上商城源码javaweb 编辑:程序博客网 时间:2024/05/16 07:37


    这几天一直在纠结 委托与事件是怎么一样的关系和区别,先看看在什么情况下产生的委托。经常我们会遇到这样的问题,就是要在不同的时候调用不同的方法。

例:向人打招呼这个方法

 

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);}
[MethodImpl(MethodImplOptions.Synchronized)]public void remove_mark(MarkGreetDelegate value){    this.mark = (MarkGreetDelegate) Delegate.Remove(this.mark, value);}

Ok了现在明白了委托和事件吗。加油,加油,这就是我对事件和委托的理解,不对之处,还请指出。