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<> 的相关文章

  • UTF8/UTF16 和 Base64 在编码方面有什么区别

    In c 我们可以使用下面的类来进行编码 System Text Encoding UTF8 System Text Encoding UTF16 System Text Encoding ASCII 为什么没有System Text En
  • 部署 MVC4 项目时出错:找不到文件或程序集

    过去 我只需使用 Visual Studio 2012 发布到 AWS 菜单项即可部署我的 MVC4 网站 到 AWS Elastic Beanstalk 现在 程序可以在本地编译并运行 但无法部署 从消息来看 它似乎正在寻找不在当前部署的
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • 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