首页 > 编程语言 >C#自定义事件的写法

C#自定义事件的写法

时间:2024-05-30 14:56:03浏览次数:24  
标签:触发 自定义 C# void EventArgs 事件 写法 public MyEventArgs

C#事件基于委托

例1:只用于学习,理解事件底层原理,不推荐这么写;
例2:系统用的就是该方式,例如按钮的Click事件;
例3:最简略的写法,但是需要客户代码转换EventArgs;

1、事件声明完整格式范例: 

 1 //自定义事件参数,默认以EventArgs结尾,需要继承EventArgs类
 2     public class MyEventArgs : EventArgs
 3     {
 4         public int ID { get; set; }
 5         public string Name { get; set; }
 6     }
 7     //声明委托类型
 8     public delegate void MyEventHandler(object sender, MyEventArgs e);
 9     public class MyClass
10     {
11         //声明委托字段
12         private MyEventHandler myEventHandler;
13         //定义事件
14         public event MyEventHandler MyEvent
15         {
16             add
17             {
18                 myEventHandler += value;
19             }
20             remove
21             {
22                 myEventHandler -= value;
23             }
24         }
25         public void Action()
26         {
27             
28             OnOrder(1, "jack");
29         }
30         //触发事件的方法一般命名为On???,并且不能是public,一般是protected,触发事件必须由对象自己触发,不能由外部触发
31         private void OnOrder(int id, string name)
32         {
33             if (myEventHandler != null)
34             {
35                 MyEventArgs e = new MyEventArgs
36                 {
37                     ID = id,
38                     Name = name
39                 };
40                 //触发事件
41                 myEventHandler.Invoke(this, e);
42             }
43         }
44     }

 

2、事件声明简化格式范例:

 1 //事件参数,默认以EventArgs结尾,需要继承EventArgs类
 2     public class MyEventArgs : EventArgs
 3     {
 4         public int ID { get; set; }
 5         public string Name { get; set; }
 6     }
 7     //声明委托类型
 8     public delegate void MyEventHandler(object sender, MyEventArgs e);
 9     public class MyClass
10     {
11         //定义事件
12         public event MyEventHandler MyEvent;
13         public void Action()
14         {
15             OnOrder(1, "jack");
16         }
17         //触发事件的方法一般命名为On???,并且不能是public,一般是protected,触发事件必须由对象自己触发,不能由外部触发
18         private void OnOrder(int id, string name)
19         {
20             if (MyEvent != null)
21             {
22                 MyEventArgs e = new MyEventArgs
23                 {
24                     ID = id,
25                     Name = name
26                 };
27                 //触发事件
28                 MyEvent.Invoke(this, e);
29             }
30         }
31     }

 

3、事件声明通常不需要自定义委托类型,一般使用系统自带的EventHandler 类型

 1 //事件参数,默认以EventArgs结尾,需要继承EventArgs类
 2     public class OrderEventArgs : EventArgs
 3     {
 4         public int ID { get; set; }
 5         public string Name { get; set; }
 6     }
 7     public class MyClass
 8     {
 9         //定义事件
10         public event EventHandler MyEvent;
11         public void Action()
12         {
13            
14             OnOrder(1, "jack");
15         }
16         //触发事件的方法一般命名为On???,并且不能是public,一般是protected,触发事件必须由对象自己触发,不能由外部触发
17         private void OnOrder(int id, string name)
18         {
19             if (MyEvent != null)
20             {
21                 OrderEventArgs e = new OrderEventArgs
22                 {
23                     ID = id,
24                     Name = name
25                 };
26                 //触发事件
27                 MyEvent.Invoke(this, e);
28             }
29         }
30     }

标签:触发,自定义,C#,void,EventArgs,事件,写法,public,MyEventArgs
From: https://www.cnblogs.com/soliang/p/18222339

相关文章

  • k8s servicemonitor 采集超时配置
    背景说明我们有时候在编写exporter时,其中某个采集的metrics接口获取数据很慢,可能需要达到10~20S,基于此种情况,如果我们按照ServiceMonitor默认的配置进行,这里默认scrapeTimeout为10S,采集时会超时,对应Prometheus的Target会提示,servicemonitor对应的State状态为Down。这里我们需要修......
  • centos7.9 升级openssh(9.7p1)
    参考自:https://blog.csdn.net/morecccc/article/details/134758892原文亲测有效,本文用于备份和记录心得注意事项:①先安装telnet,防止ssh升级失败,连不上服务器的情况(但是需要拥有root密码,才能使用su root,不然这一步可以省略)②下载想要的版本的包cd/usr/local/src/wgethttps:......
  • Java 中 controller & service & dao 之间的关系
    开门见山:Controller层调用Service层,Service层调用DAO层,DAO层负责操作Model层,从而完成整个系统的业务与处理、数据访问等功能。Model数据库实体层Model层就是数据库实体层,也被称为entity层,Bean,pojo或者po。一般数据库一张表对应一个实体类,类属性和表字段一一对应......
  • amCharts绘制折线图尾部动画
    代码案例<!DOCTYPEhtml><html><head><scriptsrc="https://cdn.amcharts.com/lib/5/index.js"></script><scriptsrc="https://cdn.amcharts.com/lib/5/xy.js"></script><scriptsrc=&qu......
  • Error in system(paste(MAKE, p1(paste("-f", shQuote(makefiles))), "compilers"),
     001、R语言windows中安装R包出现如下报错Errorinsystem(paste(MAKE,p1(paste("-f",shQuote(makefiles))),"compilers"),:'make'notfound 002、确认是否安装Rtoolsinstall.packages("pkgbuild")pkgbuild::find_rtools(debug=TRU......
  • oracle 如何设置口令复杂度和生存周期
    在Oracle数据库中,设置用户密码的复杂度通常是通过密码策略来控制的,而密码的生存周期可以通过数据字典视图DBA_PROFILES来设置。以下是如何设置用户密码复杂度和生存周期的示例代码:--设置密码策略(例如,要求密码必须每90天更改一次,且密码历史不能超过24个月)ALTERPROFILEDEFAULT......
  • 西门子opcua server CA证书连接 + 方法功能如何使用
    OPCUA概述OPCUA是一项开放标准,适用于从机器到机器间(M2M)的水平通信和从机器直到云端的垂直通信。该标准独立于供应商和平台,支持广泛的安全机制,并且可以与PROFINET共享同一工业以太网络。OPCUA通信的特性及优势特性:独立于供应商和平台集成的安全概念(加密、签名和验证)一致......
  • Particles.js:为Web项目增添动态粒子效果
    Particles.js:为Web项目增添动态粒子效果示例介绍Particles.js是一个轻量级的JavaScript库,用于在Web页面上创建和管理动态粒子效果。它允许开发者通过简单的配置文件实现复杂的动画效果,为网页增添视觉吸引力。粒子可以是点、线、图像等,能够根据用户交互进行动态变化,Particles.......
  • 是否有办法区分 Mac App Store 应用程序的重新安装和更新?
    我正在开发一款电子应用,并将其发布到MacAppStore。我的主要目标是在应用卸载(和重新安装)时清除应用创建的用户数据,而不是在更新时。但是这在MacOS上是不可能实现的,因为在MacOS上卸载只是将应用文件夹拖入垃圾箱,而垃圾箱是无法干预的。因此,我转而尝试在应用从全新安装中首次......
  • Jackson序列化为字符串时对指定字段脱敏
    枚举脱敏字段类型及规则importjava.util.function.Function;publicenumTextMaskStrategy{ID_NO("身份证",18,text->"*".repeat(text.length()-4)+text.substring(text.length()-4)),PHONE("手机号",11,text->text.substr......