C# event Action<> & event EventHandler<>

2023-11-05

event作用

我们可以通过对event的使用完成回调功能。本节通过简单的例子引入ActionEventHandler

EventHandler

    class Program
    {
        private static event EventHandler<DiagnosticsArgs> DiagnosticsEvent;
        static void Main(string[] args)
        {
            DiagnosticsEvent += Program_DiagnosticsEvent;//注册回调函数
            for (int i = 0; i < 10; i++)
            {
                if (i == 5)
                {
                    DiagnosticsEvent?.Invoke(null, new DiagnosticsArgs(100, false));//唤醒回调函数Program_DiagnosticsEvent
                }
                Thread.Sleep(500);
            }
        }

        /// <summary>
        /// 回调函数本身
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void Program_DiagnosticsEvent(object sender, DiagnosticsArgs e)
        {
            Console.WriteLine(e.FirstParamater + "\n" + e.SecondParameter);
        }
    }

    internal class DiagnosticsArgs : EventArgs
    {
        private int _firstParamater;

        public int FirstParamater
        {
            get { return _firstParamater; }
            set { _firstParamater = value; }
        }

        private bool _secondParameter;

        public bool SecondParameter
        {
            get { return _secondParameter; }
            set { _secondParameter = value; }
        }


        public DiagnosticsArgs(int first, bool second)
        {
            FirstParamater = first;
            SecondParameter = second;
        }
    }

结果:
在这里插入图片描述

Action

    class Program
    {
        //private static event EventHandler<DiagnosticsArgs> DiagnosticsEvent;
        private static event Action<DiagnosticsArgs> DiagnosticsEvent;
        static void Main(string[] args)
        {
            DiagnosticsEvent += Program_DiagnosticsEvent;//注册回调函数
            for (int i = 0; i < 10; i++)
            {
                if (i == 5)
                {
                    //DiagnosticsEvent?.Invoke(null, new DiagnosticsArgs(100, false));//唤醒回调函数Program_DiagnosticsEvent
                    DiagnosticsEvent?.Invoke(new DiagnosticsArgs(100, false));//唤醒回调函数Program_DiagnosticsEvent
                }
                Thread.Sleep(500);
            }
        }

        private static void Program_DiagnosticsEvent(DiagnosticsArgs e)
        {
            Console.WriteLine(e.FirstParamater + "\n" + e.SecondParameter);
        }

        /// <summary>
        /// 回调函数本身
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //private static void Program_DiagnosticsEvent(object sender, DiagnosticsArgs e)
        //{
        //    Console.WriteLine(e.FirstParamater + "\n" + e.SecondParameter);
        //}
    }

    internal class DiagnosticsArgs : EventArgs
    {
        private int _firstParamater;

        public int FirstParamater
        {
            get { return _firstParamater; }
            set { _firstParamater = value; }
        }

        private bool _secondParameter;

        public bool SecondParameter
        {
            get { return _secondParameter; }
            set { _secondParameter = value; }
        }


        public DiagnosticsArgs(int first, bool second)
        {
            FirstParamater = first;
            SecondParameter = second;
        }
    }

运行结果和上一次相同。

结论

单从功能上来讲,二者都可以实现函数回调,但是从设计模式的角度来看,EventHandler的封装性似乎更好,具体可参考StackOverflow相关讨论

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# event Action<> & event EventHandler<> 的相关文章

  • 如何获取正在访问 ASP.NET 应用程序的当前用户?

    为了获取系统中当前登录的用户 我使用以下代码 string opl System Security Principal WindowsIdentity GetCurrent Name ToString 我正在开发一个 ASP NET 应用程
  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 按成员序列化

    我已经实现了template
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu

随机推荐

  • R语言学习(九)动态制图——gganimater包

    gganimater包和之前的3d包一样 是对ggplot2包的扩展 主要是描绘图表的动态变化 GitHub 链接https github com thomasp85 gganimate 安装 install packages devtoo
  • 个人信息提取(字符串)

    Python 官网 https www python org 这里 才 python 前沿 可惜是英文原版 所以 我要练习英文阅读 我的CSDN主页 My Python 学习个人备忘录 我的HOT博 老齐教室 自学并不是什么神秘的东西 一个
  • ZigBee传感数据采集实验

    一 实验目的与要求 1 学习通过DHT11采集温度和湿度数据 2 掌握CC2530接收和发送串口数据 3 学习使用ZStack库 二 实验原理与内容 1 DHT11电路图 2 基本控制原理 2 1 CC2530 的 IO 口配置我们需要配置
  • AnolisOS 外传二: 在oracle 云安装并使用anolis系统

    前言 Oracle 云支持自制映像 custom images 这就给了我们很大的想象空间 本文假设您已经完成了oracle 云的账户注册工作 一 下载anolis 镜像并制作镜像 1 anolis 官网下载 anck核心 云核心 qcow
  • elasticsearch 基本语法(常见的RESTFUL API)

    一 ES的基本语法 文章目录 一 ES的基本语法 1 Query String 语法 2 Query DSL 语法 3 Full text queries 全文检索 4 Phrase search 短语搜索 5 Query and filt
  • 使用MathJax在HTML中显示LaTeX

    使用MathJax在HTML中渲染LaTex数学公式 只需加入 若需要显示行内公式 则需加入
  • JS实现冒泡排序

    一 概念 冒泡排序 Bubble Sort 是一种计算机科学领域的较简单的排序算法 它重复地走访过要排序的元素列 依次比较两个相邻的元素 如果顺序 如从大到小 首字母从Z到A 错误就把他们交换过来 走访元素的工作是重复地进行 直到没有相邻元
  • 模板特例化与偏特化

    模板是C 中一个很重要的特性 写一份代码能用于多种数据类型 包括用户自定义类型 例如 STL的sort 函数可以用于多种数据类型的排序 类stack可以用作多种数据类型的栈 但是 如果我们想对特定的数据类型执行不同的代码 而不是通用模板 呢
  • 【PyTorch学习笔记】一、两个全连接层的感知机实现(损失函数及优化器的使用)

    demo1 import torch from torch import nn 全连接类 class Linear nn Module def init self in dim out dim super Linear self init
  • pyqt5 QCheckBox使用setChecked(False)后再次用鼠标选中时无法触发信号函数的解决办法

    项目需要一个复选框QCheckBox来做某种选择 但是会有选中了但是不符合条件的情况 这种情况下需要把复选框的状态置为不选中 我的做法是在下面这个信号链接的函数中判断 if self checkBox isChecked 为真且不符合条件的
  • mysql create table select from_mysql create table select复制表结构和数据实例讲解

    比如现在有一张表 我们要将该表复制一份 以备以后使用 那么如何使用mysql语句来实现呢 其实我们可以直接使用create select from语句来实现 具体实现方法请看下面实例 我们先来创建一张Topic表 创建Topic表的SQL语
  • angular4 入门

    笔记来源于慕课网视频https coding imooc com class chapter 94 html Anchor 老师 JoJozhai 纳斯达克上市公司技术总监 创业公司CTO在angular4 中 较少组件之间的耦合 提升组件
  • Mac开机后键盘和触控板失灵

    http www jianshu com p 51d6142b564a 今天上班正敲着代码电脑突然触摸板不管用了 没办法 我用快捷键 Shift Ctrl Option 开关机键 强制关机后 再开机后 鼠标在屏幕左上角 动触摸板不管用 屏幕
  • Android Studio Kotlin环境搭建

    1 安装Kotlin插件 File gt Settings gt Plugins Kotlin 搜索并安装重启AS 2 创建一个项目 3 将Java代码转换为Kotlin 打开MainActivity 按快捷健Shift Cril A输入
  • ctf.show_web(1-14)wp

    目录 web 1 web 2 web 3 web 4 web 5 web 6 web 7 web 8 web 9 web 10 web 11 web 12 web 13 web 14 web 1 f12查看源码得到一串base64编码 解码
  • 数组去重-数组塌陷的解决方法

    var arr 23 4 23 4 23 4 54 56 54 66 43 4 1 4 6 3 4 1 66 99 for var i 0 i
  • 模拟测试Mock详解

    一 Mock模拟测试 1 Mock 测试简介 在测试过程中 数据的流转往往和系统的复杂程度有关 功能越复杂的系统 数据流转的过程越烦琐 有时候会经过数十个子系统 其上下游业务相互依赖 使得测试过程十分漫长 复杂 例如 在电商网站进行购物 需
  • 极光笔记

    对营销邮件来说 多一份送达 也许就多一个客户 因此 怎样让邮件顺利进入收件箱 是每一个市场营销人员需要面对的问题 EngageLab作为领先的客户互动和营销技术服务提供商 为市场营销人员提供了稳定 高效的电子邮件发送服务 只需几个简单的步骤
  • 排序函数qsort的使用,以及模拟实现(详解)

    了解qsort 以及模拟实现 情境引入 qsort qsort的头文件 开场 qsort的参数 为什么可以对任意类型排序呢 参数 参数 参数 参数 最难的参数 qsort应用实例 比较整形 浮点型 比较结构体的整形 比较结构体的字符串 想成
  • C# event Action<> & event EventHandler<>

    event作用 我们可以通过对event的使用完成回调功能 本节通过简单的例子引入Action和EventHandler EventHandler class Program private static event EventHandle