描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
描述(做一個簡單的記錄):
事件(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; } } }
運行後的結果如下: