C#事件

来源:https://www.cnblogs.com/chi8708/p/18187708
-Advertisement-
Play Games

EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...


C#事件

概述

定義

類或對象可以通過事件向其他類或對象通知發生的相關事情。 發送(或引發)事件的類稱為“發佈者”,接收(或處理)事件的類稱為“訂閱者”。
事件是一種特殊的多播委托,是委托實例變數, 事件只能在類的內部定義,只能從聲明它的類中進行調用。 外部只能訂閱和取消訂閱事件。

事件的組成部分

C#事件由以下三個部分組成:

  • 事件發佈者:定義事件的對象。事件發佈者負責觸發事件並通知訂閱者。
  • 事件參數:事件發生時需要傳遞的信息。事件參數可以是任何類型的對象。如果事件不需要傳遞參數,則可以使用 EventArgs 類。
  • 事件訂閱者:訂閱事件的對象。事件訂閱者會在事件發生時執行相應的操作。

基本語法

  1. 發佈者】事件聲明
    public event 委托類型 事件名;
  public event DelBtnClick OnBtnClick;
  1. 訂閱者】事件訂閱 +=,取消訂閱-=
var page = new Page();
page.OnBtnClick +=Page_OnBtnClick;

	private static void Page_OnBtnClick(ClickEventArgs eventArgs)
	{
	MessageBox.Show($"客戶端,按鈕點擊後回調 eventArgs:{eventArgs.ClickCount}");
	}
  1. 發佈者】事件觸發。其中new ClickEventArgs(1) 為回傳給訂閱者的自定義事件參數
 OnBtnClick?.Invoke(new ClickEventArgs(1));//觸發事件時 把事件參數傳遞給訂閱者。
  1. 發佈者】自定義事件參數。 繼承 EventArgs
public class ClickEventArgs : EventArgs
{
		public ClickEventArgs(int clickCount)
		{
		ClickCount = clickCount;
		}

		public int ClickCount { get; private set; }
}

常見用法/應用場景

事件的優點

  • 松耦合:事件發佈者和訂閱者之間是松耦合的,這意味著它們不需要知道彼此的內部實現細節。這使得代碼更易於維護和擴展。
  • 可擴展性:事件可以支持多個訂閱者,這使得代碼易於擴展以支持新的功能。
  • 非同步性:事件是非同步的,這意味著事件訂閱者可以在事件發生時執行任何操作,而不會阻塞事件發佈者。
    事件的應用示例

事件的缺點

  • 性能開銷性能: 事件會帶來一些性能開銷,因為需要維護事件處理程式列表,因此應儘量避免頻繁觸發事件。
  • 複雜性: 事件可能會使代碼更加複雜,尤其是當涉及到多個事件和處理程式時
  • 事件安全:事件處理程式通常在不同的線程上執行,因此需要考慮線程安全問題。
  • 事件濫用:避免過度使用事件,否則會導致代碼難以維護。

常見的應用場景

  • GUI編程:事件通常用於響應用戶交互,例如按鈕單擊、文本框輸入等。
  • 網路編程:事件可用於通知應用程式有關網路活動的事件,例如連接建立、數據接收等。
  • 系統編程:事件可用於通知應用程式有關係統活動的事件,例如進程啟動、設備連接等。

結束語言

C# 事件是一種強大的機制,可用於實現松耦合、可擴展和可重用的代碼。但是,事件也可能會帶來一些性能開銷和複雜性。

引用

  1. 博文示例代碼 https://github.com/chi8708/DotNetNote/blob/master/Note.Basic/05event.cs

  2. 參考文獻


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 運算符與表達式 Created: November 29, 2023 10:38 PM 運算符 運算符 釋義 +、-、*、/ 略 **、//、% 乘方、整除(向下取整至最接近的整數、餘數 <<、>> 指的是二進位左右移 &按位與 按位與是針對二進位數的操作,指將兩個二進位數的每一位都進行比較,如果兩 ...
  • 在現代社會中,機動車已經成為人們生活的重要交通工具。而行駛證作為機動車的身份證明,具有重要的法律效力。然而,對於行駛證上的信息進行手工識別是一項繁瑣的工作,容易出現錯誤,並且耗時較長。為瞭解決這個問題,挖數據平臺提供了行駛證OCR識別Api介面,可以對行駛證上的信息進行快速準確地識別和提取。 這個A ...
  • 大家好,我是 Java陳序員。 問君能有幾多愁,開源項目解千愁! 今天,給大家介紹一個快速開發平臺,完全開源可商用! 關註微信公眾號:【Java陳序員】,獲取開源項目分享、AI副業分享、超200本經典電腦電子書籍等。 項目介紹 SmartAdmin —— 一個簡潔、高效、安全的快速開發平臺,以高質 ...
  • 大家好,我是R哥。 金三銀四結束了,上個月分享了一個 35K 入職的面試輔導案例: 35K*14 薪入職了,這公司只要不裁員,我能一直呆下去。。 今天再分享一個上個月讓人很有成就感的面試輔導 case: 外包、空窗四個月、薪資 10k、996 ——> 甲方公司、薪資15k、早九晚六(WLB),從報名 ...
  • 當一個線程被啟動後,如果再次調start()方法,將會拋出IllegalThreadStateException異常。 這是因為Java線程的生命周期只有一次。調用start()方法會導致系統在新線程中運行執行體,但是如果線程已經結束,則不能再次使用,需要重新創建一個新的線程對象並調用start()... ...
  • 正文 昨天玩到了凌晨 3 點,今天睡了一天…… 斷斷續續睡到 12 點起床,下午又從 5 點睡到了 7 點。我願稱之為睡神……. 其它時間就是做工作日一直沒時間做的雜事,比如洗衣服,刷鞋,換洗被套什麼的,還挺花時間。用了得有兩三個小時。 所以昨天說的今天開擺,那是真的開擺了 (笑。 現在晃一下頭,能 ...
  • 1. Spring6 的JdbcTemplate的JDBC模板類的詳細使用說明 @目錄1. Spring6 的JdbcTemplate的JDBC模板類的詳細使用說明每博一文案2. 環境準備3. 數據準備4. 開始4.1 從數據表中插入(添加)數據4.2 從數據表中修改數據4.3 從數據表中刪除數據4 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...