[.NET] C# 知識回顧 - 事件入門

来源:http://www.cnblogs.com/liqingwen/archive/2016/11/14/6057301.html
-Advertisement-
Play Games

C# 知識回顧 - 事件入門 【博主】反骨仔 【原文】http://www.cnblogs.com/liqingwen/p/6057301.html 序 之前通過《C# 知識回顧 - 委托 delegate》、《C# 知識回顧 - 委托 delegate (續)》介紹了委托的基本知識,這次我們來看看 ...


C# 知識回顧 - 事件入門

【博主】反骨仔    【原文】http://www.cnblogs.com/liqingwen/p/6057301.html  

  之前通過《C# 知識回顧 - 委托 delegate》、《C# 知識回顧 - 委托 delegate (續)》介紹了委托的基本知識,這次我們來看看事件。

 

目錄

 

一、What's 事件

  類或對象可以通過事件向其他類或對象通知發生的相關事情。發送(或引發)事件的類稱為“發行者”,接收(或處理)事件的類稱為“訂戶”(訂閱者)。

  在典型的 C# Windows 窗體或 Web 應用程式中,可訂閱由按鈕和列表框等控制項引發的事件。可以使用集成開發環境 (IDE) 來瀏覽控制項發佈的事件,並選擇想要處理的事件。 IDE 將自動添加空白事件處理程式方法和訂閱該事件的代碼。 

 

二、事件的屬性彙總

  • 發行者確定何時引發事件;訂戶確定對事件作出的響應。

  • 一個事件可以有多個訂戶。訂戶可以處理來自多個發行者的多個事件。

  • 沒有訂戶的事件永遠也不會引發。

  • 事件通常用於表示用戶操作,例如單擊按鈕或圖形用戶界面中的菜單選項。

  • 當事件具有多個訂戶時,引發該事件時預設會同步調用事件處理程式。

  • 事件基於 EventHandler 委托和 EventArgs 基類。

 

三、事件的訂閱和取消

  如果您想編寫引發事件時調用的自定義代碼,則可以訂閱由其他類發佈的事件。例如,可以訂閱某個按鈕的 click 事件,以使應用程式在用戶單擊該按鈕時執行一些有用的操作。  

  1.用 IDE 訂閱事件

圖3-1-1 新建一個 WinForm 項目

圖3-1-2 由圖1雙擊時所自動創建的代碼

圖3-1-3 除了圖2,在 InitializeComponent 方法也自動增加了這行代碼

 

  2.以編程方式訂閱事件

  假設現在是一個新的 WinForm 程式,我們通過手動的方式自己創建事件。在 InitializeComponent 方法下麵輸入 this.Load +=,然後會出現提示,這時我們按下“Tab 鍵”,

 

圖3-2-1

 

  會發現也會自動創建事件處理程式,效果跟上一節的直接雙擊空白處創建的代碼可以說是一致的,代碼如下:

 1     public partial class Form1 : Form
 2     {
 3         public Form1()
 4         {
 5             InitializeComponent();
 6 
 7             this.Load += Form1_Load;
 8         }
 9 
10         private void Form1_Load(object sender, EventArgs e)
11         {
12             throw new NotImplementedException();
13         }
14     }

 

  這次,我們直接採用 lambda 方式完成事件的註冊:點擊空白處顯示滑鼠點擊時的坐標。

 1     public partial class Form1 : Form
 2     {
 3         public Form1()
 4         {
 5             InitializeComponent();
 6 
 7             //this.Load += Form1_Load;
 8 
 9             //點擊事件(lambda 方式創建)
10             this.Click += (s, e) =>
11             {
12                 MessageBox.Show($"{((MouseEventArgs)e).Location}");
13             };
14         }
15 
16         private void Form1_Load(object sender, EventArgs e)
17         {
18             throw new NotImplementedException();
19         }
20     }

  【備註】內容涉及 $: (C# 6) 的語法,vs2015 以上才支持。$"{msg}" 相當於 string.Format("{0}", msg), msg 指變數。

 圖3-2-2

 

  3.用匿名方法訂閱事件

 1         public Form1()
 2         {
 3             InitializeComponent();
 4 
 5             //this.Load += Form1_Load;
 6 
 7             //點擊事件(lambda 方式創建)
 8             //this.Click += (s, e) =>
 9             //{
10             //    MessageBox.Show($"{((MouseEventArgs)e).Location}");
11             //};
12 
13             //使用匿名方法創建事件
14             this.Click += delegate (object sender, EventArgs e)
15             {
16                 var mouseEventArgs = (MouseEventArgs)e;
17                 var mouseLocation = mouseEventArgs.Location;
18 
19                 MessageBox.Show($"X: {mouseLocation.X}, Y: {mouseLocation.Y}");
20             };
21         }

  【註意】如果使用匿名函數訂閱事件,事件的取消訂閱過程將比較麻煩。這種情況下若要取消訂閱,必須返回到該事件的訂閱代碼,將該匿名方法存儲在委托變數中,然後將此委托添加到該事件中。一般來說,如果必須在後面的代碼中取消訂閱某個事件,則建議您不要使用匿名函數訂閱此事件。

 

  4.取消訂閱

  要防止在引發事件時調用事件處理程式,請取消訂閱該事件。要防止資源泄露,應在釋放訂戶對象之前取消訂閱事件。在取消訂閱事件之前,在發佈對象中作為該事件的基礎的多路廣播委托會引用封裝了訂戶的事件處理程式的委托。只要發佈對象保持該引用,垃圾回收功能就不會刪除訂戶對象。使用減法賦值運算符 (-=) 取消訂閱事件。

            this.Load -= Form1_Load;  //使用減法賦值運算符 (-=) 取消訂閱事件

  【備註】所有訂戶都取消訂閱事件後,發行者類中的事件實例將設置為 null

 

 傳送門

  《C# 知識回顧 - 序列化

  《C# 知識回顧 - 表達式樹 Expression Trees

  《C# 知識回顧 - 特性 Attribute》、《剖析 AssemblyInfo.cs - 瞭解常用的特性 Attribute

  《C# 知識回顧 - 委托 delegate》、《C# 知識回顧 - 委托 delegate (續)

 

 


【參考】微軟官方文檔

 


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

-Advertisement-
Play Games
更多相關文章
  • 未能載入文件或程式集“Newtonsoft.Json, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b9a188c8922137c6”或它的某一個依賴項。找到的程式集清單定義與程式集引用不匹配。 (異常來自 HRESULT:0x80131040) ...
  • 環境搭建: 1)node.js版本>5.0,NPM版本>3.0,TypeScript版本>2.0(全裝最新版就好了) 2)安裝NTVS 1.2(node tools for vs),TSVS dev 1.4(TS for VS) 3)構建package.json,tsconfig.json,gulp ...
  • 1、環境部署: windows server 2008R2環境 2、相關軟體 SVN(源代碼管理器:jenkins通過插件從源代碼管理器下載代碼) Jenkins(主角)地址:http://ftp.yz.yamagata-u.ac.jp/pub/misc/jenkins/windows-stable ...
  • ReSharper 10.0.0.1 Ultimate 完美破解補丁使用方法,本資源來自互聯網,感謝吾樂吧軟體站的分享。 ReSharper是一款由jetbrains開發的針對C#, VB.NET, ASP.NET, XML, 和 XAML的編輯器。沿襲了jetbrains開發工具一貫的優良傳統,R ...
  • 添加引用時生成”勾選允許生成非同步操作” Wcf非同步調用三種方式: 第一種:直接調用非同步方法 var serviceClient = new MyServiceClient(); serviceClient.MessageAsync(); erviceClient.Close(); 第二種:Begin ...
  • 一、MessageBox的Buttons MessageBox.Show可以出現有按鈕的對話框 例如: DialogResult dr = MessageBox.Show("是否要繼續嗎?", "警告!!!", MessageBoxButtons.OKCancel);//它彈出的對話框如下圖所示if ...
  • 一、客戶端設計思路 1.理順設計思路,架構框架 2.設計界面 3.編寫後臺代碼 4.資料庫訪問 二、公共控制項 1、Button(按鈕): ⑴ Enabled :確定是否啟用控制項 ⑵ Visible:確定控制項是否課件; 2、CheckBox(多選項) 、CheckListBox -(多選項列表) 3、 ...
  • Asp.Net MVC4 BundleConfig文件合併、壓縮,網站優化加速 Asp.Net MVC4 BundleConfig文件合併、壓縮,網站優化加速 瀏覽器在向伺服器發送請求的時候,請求的文件鏈接數量是有限制的,如果頁面文件少就沒有什麼問題了,如果文件太多就會導致鏈接失敗等等問題。針對這個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...