描述(做一个简单的记录):
事件(event)的本质是一个委托;(声明一个事件: public event TestDelegate eventTest;)
委托(delegate)可以理解为一个符合某种签名的方法类型;比如:TestDelegate委托的返回数据类型为string,参数为 int和EventPara,而TestI方法的参数和返回类型和TestDelegate一致,则可以把TestI方法赋值给委托tI;
注册事件:我在构造函数的时候注册这个事件(eventTest += delTest;)并且把触发这个事件的参数也传进来(_eventPara = e;);
触发事件:当给Number这个字段赋值时触发事件(eventTest(_number, _eventPara); ),事件被触发后TestI这个方法将被执行;
(如果此文档对你有帮助,欢迎点赞加关注,也欢迎评论互相交流)
代码如下(此代码可以直接运行,本人在vs2022运行):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Xml.Serialization; using Ttest;namespace _SJ.Test {internal class Program{static void Main(string[] args){EventPara eventPara_zs = new EventPara();eventPara_zs.Age = 18;eventPara_zs.Name = "张三";TestDelegate tI = TestI;EventTest test = new EventTest(tI, eventPara_zs);for (int i = 1; i < 10; i++){test.Number = i;//模拟触发一个事件; 每赋值一个值,触发一个事件}Console.WriteLine( "结束");Console.ReadKey(); }private static string TestI(int i, EventPara e){Console.WriteLine($"触发者:{e.Name}, 触发者的年龄:{e.Age}; 触发次数:" + i.ToString());return "触发"+i.ToString();}}/// <summary>/// 自定义的事件参数/// </summary>public class EventPara: EventArgs{public int Age { get; set; }public string Name { get; set; }}//声明委托public delegate string TestDelegate(int i, EventPara e);public class EventTest{/// <summary>/// 声明事件/// </summary>public event TestDelegate eventTest;/// <summary>/// 私有的事件参数/// </summary>private EventPara _eventPara;private int _number;public int Number {get { return _number; }set {_number = value;eventTest(_number, _eventPara); //触发事件}}/// <summary>/// 构造时传递一个委托和事件参数/// </summary>/// <param name="delTest"></param>public EventTest(TestDelegate delTest, EventPara e){eventTest += delTest;_eventPara = e;}} }
运行后的结果如下: