C# 有了委托(delegate)为什么还需要事件(event)?

 相信很多很多人对C#的delegate和event很迷惑,为什么有了delegate还需要event?

网上有一个非常好的教学视频,是刘铁猛老师精心制作,讲的非常好,欢迎去看。分享链接:

事件详解_3

视频整个比较长。不想看视频的,也可以看下这个例子。

using System;
using System.Threading;

delegate void dowork(); // 委托申明
class Baby{
    public event dowork CryEvent; // 事件成员(fild like)
    public void Play()
    {
        System.Console.WriteLine("孩子在玩耍...");
        Thread.Sleep(2000);
        System.Console.WriteLine("孩子摔了一跤.导致孩子哭的事件发生...");
        if(CryEvent!=null)
            CryEvent();
        System.Console.WriteLine("孩子不哭了.");
    }
}

class Dad{
    public void MakeBabyNotCry() // 事件处理器
    {
        System.Console.WriteLine("爸爸开始哄孩子.");
        Thread.Sleep(4000);
    }
}

class Program
{
    public static void Main()
    {
        Baby baby = new Baby(); // 事件拥有者
        Dad dad = new Dad();    // 事件响应者
        baby.CryEvent += dad.MakeBabyNotCry; // 订阅
        baby.Play();
        Console.Read(); 
    }
}

 如果你删除了第6行的event关键字,重新运行,我们会发现代码仍然可以正确运行。

那么为什么要加event?  我们有一种既生瑜(delegate)何生亮(event)的感觉。

做个试验,假设保持上面的代码不变,也就是第6行定义中包含event关键字,然后在32行后添加一句:

baby.CryEvent();

我们会发现编译提示出错。编译器会告诉我们event只能出现在"+="或"-="左边。

如果去掉第6行的event关键字,然后同样在32行后添加baby.CryEvent(),编译器不会有任何错误提示,表示CryEvent()这个方法是可以被显示调用的。

这就是两者的区别。有了event关键字,暴露的事件我们只能增加或者减少事件处理器,而仅仅是delegate时,我们可以显示调用这个方法。如果方法可以被显示调用,那么这个方法和普通方法显得没啥区别,就会存在不安全的情况,事件详解_3中称这种不安全的调用为"借刀杀人",这个比喻非常形象。

因为我们event的处理逻辑包含在事件拥有者内部,如果不想把事件的调用权限给别人随意使用,我们就应当用event。

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮君

写作不易,多谢赏赐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值