EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
C#事件
概述
定義
類或對象可以通過事件向其他類或對象通知發生的相關事情。 發送(或引發)事件的類稱為“發佈者”,接收(或處理)事件的類稱為“訂閱者”。
事件是一種特殊的多播委托,是委托實例變數, 事件只能在類的內部定義,只能從聲明它的類中進行調用。 外部只能訂閱和取消訂閱事件。
事件的組成部分
C#事件由以下三個部分組成:
- 事件發佈者:定義事件的對象。事件發佈者負責觸發事件並通知訂閱者。
- 事件參數:事件發生時需要傳遞的信息。事件參數可以是任何類型的對象。如果事件不需要傳遞參數,則可以使用 EventArgs 類。
- 事件訂閱者:訂閱事件的對象。事件訂閱者會在事件發生時執行相應的操作。
基本語法
- 【發佈者】事件聲明
public event 委托類型 事件名;
public event DelBtnClick OnBtnClick;
- 【訂閱者】事件訂閱 +=,取消訂閱-=
var page = new Page();
page.OnBtnClick +=Page_OnBtnClick;
private static void Page_OnBtnClick(ClickEventArgs eventArgs)
{
MessageBox.Show($"客戶端,按鈕點擊後回調 eventArgs:{eventArgs.ClickCount}");
}
- 【發佈者】事件觸發。其中new ClickEventArgs(1) 為回傳給訂閱者的自定義事件參數
OnBtnClick?.Invoke(new ClickEventArgs(1));//觸發事件時 把事件參數傳遞給訂閱者。
- 【發佈者】自定義事件參數。 繼承 EventArgs
public class ClickEventArgs : EventArgs
{
public ClickEventArgs(int clickCount)
{
ClickCount = clickCount;
}
public int ClickCount { get; private set; }
}
常見用法/應用場景
事件的優點
- 松耦合:事件發佈者和訂閱者之間是松耦合的,這意味著它們不需要知道彼此的內部實現細節。這使得代碼更易於維護和擴展。
- 可擴展性:事件可以支持多個訂閱者,這使得代碼易於擴展以支持新的功能。
- 非同步性:事件是非同步的,這意味著事件訂閱者可以在事件發生時執行任何操作,而不會阻塞事件發佈者。
事件的應用示例
事件的缺點
- 性能開銷性能: 事件會帶來一些性能開銷,因為需要維護事件處理程式列表,因此應儘量避免頻繁觸發事件。
- 複雜性: 事件可能會使代碼更加複雜,尤其是當涉及到多個事件和處理程式時
- 事件安全:事件處理程式通常在不同的線程上執行,因此需要考慮線程安全問題。
- 事件濫用:避免過度使用事件,否則會導致代碼難以維護。
常見的應用場景
- GUI編程:事件通常用於響應用戶交互,例如按鈕單擊、文本框輸入等。
- 網路編程:事件可用於通知應用程式有關網路活動的事件,例如連接建立、數據接收等。
- 系統編程:事件可用於通知應用程式有關係統活動的事件,例如進程啟動、設備連接等。
結束語言
C# 事件是一種強大的機制,可用於實現松耦合、可擴展和可重用的代碼。但是,事件也可能會帶來一些性能開銷和複雜性。
引用
- 使用事件- C# 編程指南 - Microsoft Learn: https://learn.microsoft.com/zh-cn/dotnet/csharp/programming-guide/events/
- C# 中的委托和事件(詳解): https://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html