C#事件

C#事件实例详解 通过实例说明事件的定义、使用。并说明相关意义和使用技术及原因。 阅读详情

C#事件的用法与意义

C#事件与委托十分相似,其实事件包含了一个私有委托,所以事件就像是专门用于某种特殊用途的简单委托。

事件使用的方法图:


正如上图所示,发布者类Incrementer里面的事件CountedADozen就像一个装方法的容器,这个容器对方法的添加与删除是里面的私有委托来实现的(这里待会儿可以通过代码理解),发布者类Incrementer还有一块触发事件的代码,这段触发事件代码的方法是那个方法容器的引线,只要运行这方法,引线点燃(触发事件的代码开始运行),引爆了容器(事件CountedADozen开始运行委托里面装载的方法,比如图中的IncrementDozensCount( )和DoSomething( )),这样就走完了从触发代码到运行所有订阅者代码的流程。

以下是实现代码:

 delegate void Handler();


    class Incrementer//发布者
    {
        public event Handler CountedADozen;
        public void DoCount()//触发事件的方法
        {
            for (int i = 1; i < 50; i++)
            {
                if (i % 12 == 0 && CountedADozen != null)//每增加12个计数就触发事件一次,私有委托为空就不执行
                {
                    CountedADozen();
                }
            }
        }
    }




    class Dozens
    {
        public Dozens(Incrementer incrementer)
        {
            incrementer.CountedADozen += IncrementDozensCount;//在发布者私有委托里增加方法
        }


        void IncrementDozensCount()//事件成员被触发时要调用的方法
        {
            Console.WriteLine("Dozens");
        }
    }




    class SomeOtherClass
    {
        public SomeOtherClass(Incrementer incrementer)
        {
            incrementer.CountedADozen += DoSomething;//在发布者私有委托里增加方法
        }


        public void DoSomething()//事件成员被触发时要调用的方法
        {
            Console.WriteLine("SomeOtherClass");
        }
    }




    class Program
    {
        static void Main()
        {
            Incrementer incrementer = new Incrementer();
            Dozens dozensCounter = new Dozens(incrementer);
            SomeOtherClass other = new SomeOtherClass(incrementer);  
            //incrementer.CountedADozen()     
            incrementer.DoCount();
        }
    }

运行结果:



事实上委托与事件的使用的本质差距在event这关键字(可见上图代码第三句),在这段代码里面有没有event关键字运行结果都一样,所以这里看不出差别,但是如果把主函数里面注释掉的代码incrementer.CountedADozen()用出来会报错,但是如果把关键字event取消掉就不报错了,这是因为如果不用event这就跟普通委托一样了,是可以直接调用委托,而加了event关键字才称为事件,事件是不能直接调用委托的,必须在发布者内部调用,你会说那么怎么用呢?只能通过发布者内部方法Docount( )去间接调用,不能随意调用也体现了事件更加安全的优点,这正是事件与委托的使用区别。

C# 事件(Event)详解 定义委托类型:声明事件的委托类型。定义事件:使用event关键字声明事件。触发事件:通过委托触发事件。//声明委托类型//声明事件//触发事件的方法MyEvent?");//触发事件//事件处理方法//订阅事件//触发事件• 事件是基于委托的,提供了一个更严格的方式来管理方法的调用,尤其适用于需要通知和异步操作的场景。• 事件允许发布-订阅模式,使得多个对象能够订阅并响应特定的事件。 阅读详情

相关推荐

C# 事件(Event)

在 C# 中,事件(Event)是一种特殊的成员,它扮演着传递特定事件通知给订阅者的重要角色。事件机制常被用于实现观察者模式,借助这一模式,一个对象能够在自身状态发生变化时,将该变化情况通知给其他相关对象,而且无需了解这些接收通知对象的具体细节信息。从更宽泛的角度来讲,事件可以是用户进行的各类操作,比如按下按键、点击鼠标、移动鼠标等,也可能是系统生成的提示信息之类的内容。应用程序需要具备在事件发生时做出相应响应的能力,就像应对中断情况那样。此外,在 C# 里还可以利用事件机制来实现线程间的通信功能。

2401_83367969的博客 2233

C#事件--全网最全+全网最易理解

一、初步了解事件 1.事件的定义: 事件英文解释为:a thing that happens,especially something important.

nameyichao的博客 3万+

C#自定义事件监听实现方法

主要介绍了C#自定义事件监听实现方法,涉及C#事件监听的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

【C#进阶】C# 事件

🌍 hello大家好啊,我是哈桑。本文为大家介绍 C# 中的事件。事件本质上来讲是一种特殊的多播委托1,只能从声明它的类中进行调用。事件通常用于表示用户操作,例如单击按钮或图形用户界面中的菜单选项。C# 中常常会使用事件来实现线程之间的通信。不仅是在类中,在接口中也可以声明事件,称为接口事件。接口事件的实现和接口上的方法或属性的实现是一样的,以一个示例来说明如何在类中实现接口事件。

好学若饥,谦卑若愚。 5302

手把手教你用ZLMediaKit搭建WebRTC直播:本地推流与播放实战

本文详细介绍了如何使用ZLMediaKit搭建WebRTC直播系统,涵盖从环境准备、编译部署、SSL证书配置到本地推流与播放的完整实战流程。通过一步步的指导,帮助开发者快速掌握基于ZLMediaKit的WebRTC推拉流技术,构建低延迟的实时音视频应用。

weixin_28842367的博客 348

Maya绑定:人物绑定详细案例(创建骨骼、镜像骨骼、IK创建、IK打组、IK控制器、FK控制器、烘焙动画、导出)

Maya绑定:人物绑定详细案例(创建骨骼、镜像骨骼、IK创建、IK打组、IK控制器、FK控制器、烘焙动画、导出)

m0_45877477的博客 1635

C#中事件

一、事件基础 1、事件简介 事件常用于对某一消息作出的反应。当某一事件被触发之后,就会对其做出对应的响应。 连接消息和反馈动作的符号为+=,符号左侧表示发出的消息,右侧表示对消息做出的响应函数 2、事件提示及查看 在输入对象加点号后,VS会出现智能提示,其分别代表: 小扳手:表示属性 立方体:表示函数或方法 闪电:表示事件 二、常见事件示例 1、定时器事件Timer 要包含对应的命名空间:using System.Timers; 指定时间间隔,然后每到指定的间隔就响应一次,代码如下:

Jeffxu_lib的博客 8151

用Omniverse Kit开发第一个USD插件:从环境配置到实战案例(Python 3.7版)

本文详细介绍了如何使用NVIDIA Omniverse Kit和Python 3.7开发第一个USD插件,涵盖从环境配置到实战案例的全过程。通过创建可实时同步材质属性的USD插件,开发者可以快速掌握Omniverse开发框架,提升3D内容创作效率。

x8y9z0的博客 588

C# 事件

C# 事件 事件简介 Microsoft Docs上的解释: 事件是对象用于(向系统中的所有相关组件)广播已发生事情的一种方式。 任何其他组件都可以订阅事件,并在事件引发时得到通知。 这样说比较抽象,打个比方:你有一只看门狗,如果小偷来了,你的狗会叫,你听到狗叫就会起来抓小偷,这就是狗想你广播小偷来了这件事。 事件的特点 事件有三个要素:事件拥有者、事件订阅者、事件处理方法 事件拥有者...

qq_41701316的博客 3005

云漾AI创作平台实战:如何用GPT4.0+Midjourney快速生成商业级插画(附Prompt模板)

本文详细介绍了如何利用云漾AI创作平台结合GPT4.0和Midjourney快速生成商业级插画。通过智能文案生成与视觉化工作流,大幅提升创作效率,适用于电商、社交媒体等多种场景。文章包含实用Prompt模板和参数调整技巧,帮助设计师和内容创作者高效产出专业插画。

weixin_29251567的博客 219

【DRAM存储器十五】DDR介绍-关键技术之DLL和prefetch

详述DDR DLL和预取原理以及几个DDR相对初代SDRAM新增的时序参数

highman110的博客 4368

也谈JAVA事件和C#事件

             再未识JAVA之前,看JAVA语法和C#惊人的相似,因此就很盲目的认为会C#就会JAVA两者基本是一个东西-_-#,直到最近处理一些代码需要用到事件来隔离视图和控制时才发现原来两者相似只是表层上,底层的东西完全不一样,JAVA有着自己的机制,C#是从C++发展过来的东西,虽然丢掉了指针,但是从它的本质上来说却更类似于C++......            JAVA事

Red_angelX的专栏 2722

ubuntu-25.04-desktop-amd64 工具VMware-tools 正确安装方法

摘要:Ubuntu 25.04虚拟机安装VMware Tools后无法实现主机与虚拟机间的文件复制粘贴和拖拽功能,问题可能源于工具兼容性。建议优先安装open-vm-tools套件(含open-vm-tools-desktop),而非官方VMware Tools。具体方案:通过终端执行安装命令后重启系统。该方法已实测有效解决该兼容性问题。(149字)

安徽锐锋科技-沐雨潇竹 672
下一篇: C#协变与逆变
EagleGoing
博客等级 码龄10年 9粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值