委托与事件的理解


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

例:向人打招呼这个方法

 

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了现在明白了委托和事件吗。加油,加油,这就是我对事件和委托的理解,不对之处,还请指出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值