C# 事件

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

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


C# 事件

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

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

 

目錄

  • What's 事件
  • 事件的屬性彙總
  • 事件的訂閱和取消
    1. 使用 Visual Studio IDE 訂閱事件
    2. 以編程方式訂閱事件
    3. 使用匿名方法訂閱事件
    4. 取消訂閱

 

一、What's 事件

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

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

 

二、事件的屬性彙總

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

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

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

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

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

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

 

三、事件的訂閱和取消

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

  1.使用 Visual Studio 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     }

 圖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
更多相關文章
  • 一、系統以及軟體的準備 系統及編譯安裝包的下載地址:http://pan.baidu.com/s/1jIjqinc 密碼:ghc2 說明:由於centos6.5是分捲壓縮的,且壓縮為三個壓縮包,所以請下載三個壓縮包,並放於同一文件夾中,解壓CentOS-6.5-x86_64-bin-DVD.zip即 ...
  • docker部署環境:CentOS release 6.5 (Final) Docker配置文件:/etc/sysconfig/docker 重要參數解釋: -H 表示Docker Daemon綁定的地址 -H unix:///var/run/docker.sock -H tcp://0.0.0.0 ...
  • 一、Linux操作系統簡介 1、Linux系統定義:Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統 2、Linux系統運行穩定,主要用於伺服器。 3、Linux系統用戶分為: a、系統用戶root:提示符# b、 ...
  • 1.GFS介紹 GFS簡要說明,它有兩種: 1. Google文件系統:GFS是GOOGLE實現的是一個可擴展的分散式文件系統,用於大型的、分散式的、對大量數據進行訪問的應用。它運行於廉價的普通硬體上,但可以提供容錯功能。它可以給大量的用戶提供總體性能較高的服務。欲瞭解更多,可以訪問:http:// ...
  • 題目描述 Description 在小松宿舍樓下的不遠處,有PK大學最不錯的一個食堂——The Farmer’s Canteen(NM食堂)。由於該食堂的菜都很不錯,價格也公道,所以很多人都喜歡來這邊吃飯。The Farmer’s Canteen的點菜方式如同在超市自選商品一樣,人們從一個指定的路口 ...
  • 公司的同事離職了,接下來的日子可能會忙碌,能完善DEMO的時間也會少了,因此,把做的簡易DEMO整體先記錄一下,等後續不斷的完善。 參考兩位大神的日誌:WEB版微信協議部分功能分析、【完全開源】微信客戶端.NET版 尤其是周見智大神的DEMO,因為好多和微信的服務端交互,都借鑒了大神的源碼,幫助巨大 ...
  • 首先對項目添加名為Microsoft.VisualBasic.dll的引用,然後添加命名空間using Microsoft.VisualBasic.FileIO;usingSystem;namespaceleaver{ classProgram { staticvoidMain(string[]ar... ...
  • No.1 準備應用程式 1. 創建.Net Core Web項目 2. 使用VS2015發佈 No.2 安裝.Net Core for Ubuntu Ubuntu的安裝就不介紹了,百度搜索一大堆。本人用的VMWare,裝好Tools很方便。 1. 添加dotnet源 2. 安裝.Net Core S ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...