重温C#2.0之委托(delegate,Delegate,MulticastDelegate)与事件(event)区别

来源:互联网 发布:安卓数据恢复工具 编辑:程序博客网 时间:2024/04/28 12:03

http://blog.sina.com.cn/s/blog_71f2bd7f0100qv6e.html


一 delegate、Delegate、MulticastDelegate的区别

1 Delegate:是一个抽象基类,它引用静态方法或引用类实例及该类的实例方法。然而,只有系统和编译器可以显式地从Delegate 类派生出委托类型。

2MulticastDelegate:是一个继承于Delegate的类,其拥有一个带有链表格式的委托列表,该列表称为调用列表,在调用多路广播委托时,将按照调用列表中的委托出现的顺序来同步调用这些委托。平常我们声明一个delegate的类型,都是继承于MulticastDelegate类的(注意:不能显式地从此类进行派生。这点与Delegate类是一样的,只有系统和编译器也可以显示地进行派生)。

3 delegate 是一个C#关键字,用来定义一个新的委托类型(继承自MulticastDelegate类)。

 

示例说明

class Program
{

   //这里就是声明了一个新的委托类型GreetingDelegate。

    publicdelegate void GreetingDelegate(string name);

    publicstatic GreetingDelegate delegate1;
    static voidMain(string[] args) 
    {

       //这里声明了委托类型GreetingDelegate的变量delegate1,并注册两个委托到其调用列表中。
       delegate1 += EnglishGreeting; 
       delegate1 += ChineseGreeting;

       //这里进行调用,会依次同步调用注册的上面两个委托对应的方法。
       delegate1("Cupid");

       //这里的输出就能知道委托类型GreetingDelegate实际是继承自MulticastDelegate类。

       Console.WriteLine(typeof(GreetingDelegate).BaseType.FullName); 
    }

    static voidEnglishGreeting(string name) 
   
       Console.WriteLine("Hello {0}", name); 
    }

    static voidChineseGreeting(string name) 
   
       Console.WriteLine("你好 {0}", name); 
   
}

二 为什么有些场景会用到事件(event)呢?

其实有些场景的话,使用委托就可以解决了的,比如上面的示例。当然,如果一定要用event也可以,把

public static GreetingDelegate delegate1这句换成

public static event GreetingDelegate delegate1;

即加一个event关键字就可以了。 
所以上面的理由只能说明一点:事件就是对委托类型的一种特殊封装。

但为什么还是会出现使用event关键字的场景呢,比如Form的Load事件等。

其真正的特殊性如下

1 事件的设计是从面向对象的角度进行设计的。事件的触发,只能由事件的发行者负责,事件的订阅者只负责触发时执行什么动作。

2 用Reflector工具对上面的示例进行反编译,这句定义:public static eventGreetingDelegate delegate1;其实变成了:

private static GreetingDelegatedelegate1;//修饰符变为了private,这解释了为什么只能由事件的发行者负责触发调用

public static GreetingDelegatedelegate1;//这里的Public修饰符才是我们写代码时给事件定义的修饰符。

{

   add{…}

   remove{…}

}

 

参考资料:

1 http://blog.csdn.net/chopper7278/archive/2008/10/25/3145000.aspx

2 http://msdn.microsoft.com/zh-cn/library/awbftdfh(v=VS.80).aspx

3 http://msdn.microsoft.com/zh-cn/library/system.delegate(v=VS.80).aspx

 


0 0
原创粉丝点击