C# 中delegate和event的区别

这篇博客探讨了C#中的Delegate和Event的区别。Delegate是事件的基础,两者在类内部使用上相似,但Event在类外部只能进行+=和-=操作,不能直接调用。Event提供了一种安全的方式来触发事件,只能由声明它的类调用。为了在派生类中调用基类的事件,通常需要创建一个受保护的方法。总结了Delegate和Event的关键特性及其在实际编程中的应用。
摘要由CSDN通过智能技术生成

转载地址:https://www.cnblogs.com/wanglla/p/4257135.html

相关内容学习网址:
https://blog.csdn.net/wcc27857285/article/details/78023235
https://blog.csdn.net/kcseason/article/details/4242425

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值