一、概念
EventArgs是.net框架中的一個基類,是所有事件參數類的父類。當事件被觸發時,事件處理程序接收到一個包含事件數據的對象,這個事件數據所在的類就是Args的一個子類。
public class EventArgs { public static readonly EventArgs Empty = new EventArgs(); public EventArgs() { } }
從上面的代碼可以看出,EventArgs並沒有包含太多的內容,旨在為派生類提供一個基礎。
二、事件處理
在c#中,如果我們想要自定義事件,我們必須先定義一個委託類型,然後使用關鍵字event聲明一個事件並綁定上剛才定義的委託類型。下面給出一個簡單的例子。
定義委託類型:
public delegate void EventHandler(object sender, EventArgs e);
定義事件:
public class MyClass { public event EventHandler MyEvent;}
在上面的代碼中,通過event關鍵字聲明了一個名為MyEvent的事件,類型為EventHandler,該事件在MyClass中被引發。
那麼在事件的觸發過程中,EventHandler對參數的傳遞使用了EventArgs作為基礎類。在事件觸發時,可以向事件處理程序傳遞EventArgs或其派生類的對象,以便提供與事件相關的數據。示例如下:
public class MyEventArgs: EventArgs { public int Value { get; set; }}public class MyClass { public event EventHandler<MyEventArgs> MyEvent; public void RaiseEvent() { var args = new MyEventArgs { Value = 42 }; MyEvent?.Invoke(this, args); }}public class Program { private static void Main(string[] args) { var myClass = new MyClass(); myClass.MyEvent += MyClass_MyEvent; myClass.RaiseEvent(); } private static void MyClass_MyEvent(object sender, MyEventArgs e) { Console.WriteLine($"MyEvent handled! The value is {e.Value}."); }}// 輸出:// MyEvent handled! The value is 42.
在上面的代碼中,MyClass類中定義了MyEvent,這個事件使用了泛型委託類型,並使用了自定義的派生類MyEventArgs。事件被觸發時,生成了一個新的MyEventArgs對象並將其傳遞給處理程序,從而可以在事件處理程序中訪問該事件的data(Value屬性)。MyClass類的RaiseEvent()方法通過調用MyEvent.Invoke()方法來觸發該事件。
三、實際使用
EventArgs最常見的用法是作為一些標準事件如Button.Click和KeyPress的參數。當控制項上發生了這樣的事件時,系統會將一個包含事件數據的EventArgs對象,以及控制項的引用,傳遞給註冊的事件處理程序。
下面給出一個自定義事件的例子,該事件用於通知觀察者在賬戶餘額發生變化時更新UI。如果你有一個基於事件的賬戶對象,你可能想要添加一個事件,以使UI在餘額變化時能夠及時匹配。在這樣的情況下,EventArgs類無法滿足我們的需求,我們需要自定義一個類來存儲有關餘額變更的數據,如下:
public class AccountEventArgs : EventArgs { public decimal Balance { get; set; } // 新的賬戶餘額 public AccountEventArgs(decimal balance) { Balance = balance; }}public class Account { private decimal _balance; public EventHandler<AccountEventArgs> OnBalanceChanged; public decimal Balance { get => _balance; set { _balance = value; OnBalanceChanged?.Invoke(this, new AccountEventArgs(_balance)); } }}public class Program { private static void Main(string[] args) { var account = new Account { Balance = 100 }; account.OnBalanceChanged += Account_OnBalanceChanged; account.Balance -= 50; account.Balance += 200; } private static void Account_OnBalanceChanged(object sender, AccountEventArgs e) { Console.WriteLine($"The balance changed to {e.Balance}"); }}// 輸出:// The balance changed to 50// The balance changed to 250
在上面的代碼中,Account在setter中觸發了OnBalanceChanged事件,該事件使用AccountEventArgs類來傳遞餘額數據。在Main方法中,我們在account對象上註冊Account_OnBalanceChanged方法來處理OnBalanceChanged事件。隨著balance的減去50和增加200,Account_OnBalanceChanged被調用來處理這些變化,並輸出消息。
四、結論
EventArgs提供了一種在觸發事件時傳遞數據的方法,被廣泛應用於各種類型的事件中。此外,自定義EventArgs子類可用於定義特定事件的數據,以便於事件處理程序可以訪問事件的特定內容。對於需要自定義事件的程序員來說,熟悉EventArgs的使用使得更加容易地實現事件。
原創文章,作者:QELYG,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/369433.html