zoukankan      html  css  js  c++  java
  • C# 中delegate和event的区别

    event是一种特殊的delegate,定义它们的类里边,这二者是一样的,既可以采用 += 和-=的运算符号,也可以调用,但是在这个类之外,它们是不同的。

    同为public类型,对于delegate,我们在定义它的类外,不仅可以采用 += 和-=的运算符号,还可随时调用;但是对于event,在类外只能采用 += 和-=的运算符号,不能调用,也就是event把它本身的invoke函数和括号调用的函数变成拥有这个event类的私有函数。

    举个例子:

    public class Publisher

        {

            public delegate void SampleEventHandler(string e);  

            public event SampleEventHandler SampleEvent;  //  只能在类内部调用

            public SampleEventHandler NoEvent;//可以在类外调用

            protected void RaiseSampleEvent(string str) //声明一个方法,调用类内部的event,一边外部可以调用类内部的event

            {

                // 调用类内部的event,没有问题

                SampleEvent(str);

            }

        } 

    //外部的调用

     public void testEvent()

            {

                Publisher publisher = new Publisher();

                publisher.NoEvent += TestEvent;  //给delegate赋值。

                publisher.NoEvent("e"); // 调用delegate,没有问题          

                publisher.SampleEvent += TestEvent; // 给event赋值,这没有问题

                publisher.SampleEvent("e"); //调用event,这个就错了,只能在Publisher内部调用

            }

    还有一点,event只能被本类调用,其他的即使该类的派生类也不行,如果非要调用类内部的event,可以先声明一个方法,在该方法中调用event,例如Publisher类中的RaiseSampleEvent方法。

    MSDN中关于在派生类中调用event

    在创建可用作其他类的基类的类时,应考虑如下事实:事件是特殊类型的委托,只可以从声明它们的类中调用。 派生类无法直接调用基类中声明的事件。 尽管有时需要事件仅由基类引发,但在大多数情形下,应该允许派生类调用基类事件。 为此,您可以在包含该事件的基类中创建一个受保护的调用方法。 通过调用或重写此调用方法,派生类便可以间接调用该事件。

  • 相关阅读:
    GCC内置函数
    父类子类的拷贝构造与赋值
    外传三 动态内存申请的结果
    外传二 函数的异常规格说明
    外传一 异常处理深度解析
    第69课 技巧,自定义内存管理
    第68课 拾遗,令人迷惑的写法
    第67课 经典问题解析五
    第66课 C++中的类型识别
    第65课 C++中的异常处理(下)
  • 原文地址:https://www.cnblogs.com/wanglla/p/4257135.html
Copyright © 2011-2022 走看看