惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
GbyAI
GbyAI
Engineering at Meta
Engineering at Meta
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
H
Hackread – Cybersecurity News, Data Breaches, AI and More
WordPress大学
WordPress大学
博客园_首页
美团技术团队
H
Help Net Security
MongoDB | Blog
MongoDB | Blog
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
J
Java Code Geeks
A
About on SuperTechFans
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
T
The Blog of Author Tim Ferriss
Microsoft Azure Blog
Microsoft Azure Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog
雷峰网
雷峰网
爱范儿
爱范儿

博客园 - vidorlee

GitHub退款申请经验分享 C# 如何避免在基类中实现所有接口同时也不让每个子类重复实现 CoreXY运动结构工作原理 最佳的实现Winfrom无边框四周阴影方案 在VS2022上安装pygame模块 漫谈Winform控件优化之圆角矩形边框处理 C#中设置自定义控件工具箱图标 讨论TableLayoutPanel加载缓慢和闪烁问题解决方案 关闭Windows 10自动更新的方法 MVVM模式开发WinForm-ReactiveUI C#单例模式的用途 TensorFlow基本使用教程 C#多线程Task创建 PropertyChanged.Fody自动通知属性插件 5、Pico Robot 机器人课程 4、Pico Robot 传感器进阶课程 3、Pico Robot 基础开发课程 2、Pico Robot 开发环境搭建 1、Pico Robot 智能小车平台介绍
C#自定义事件的写法
vidorlee · 2024-05-30 · via 博客园 - vidorlee

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     }