C# Delegate 与 Event 的区别

Delegate是引用类型,会分配堆内存,是一个包含了相同返回值和函数参数签名的方法列表

可以使用的操作符 = += -= 

如果不小心写成了= 将会清空之前的方法列表 只会调用当前复制的函数

Delegate不能声明在Interface中

原因:委托只是一种定义方法签名的类型 接口中只能定义本质为方法的成员,不能定义类 ,委托是一个类 

 

Event是在Delegate上面的封装,在内部隐式的生成一个私有的Delegate ,以及add_xxx(),renove_xxx() 函数所以我们只能通过+= ,-= 操作符来操作Event 

Event可以再Interface中声明

在声明委托与实践 的类中使用它们几乎没有区别,但是在这个类之外使用时,是不同的

同为Public的委托,与时间类型 ,在定义它们的类的外部,可以使用+=和-=运算符号 ,Delegate类型的可以再类的外部随时调用,而Event类型的即使是Public的也不能在类的外部调用也就是event把本身的invoke函数和括号调用的函数编程私有函数

public class Publisher

    {

        public delegate void SampleEventHandler(string e);  

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

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

        protected void RaiseSampleEvent(string str)

        {
            // 调用类内部的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方法。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值