C# 事件詳解

C# 事件

      • 一、事件
      • 二、事件的應用
      • 三、事件的自定義聲明

一、事件

  1. 定義:“a thing that happens, especially something important” / “能夠發生的什么事情”
  2. 角色:使對象或類具備通知能力的成員
  3. 使用:用于對象或類間的動作協調與信息傳遞
  4. 事件的功能=通知+可選的事件參數
  5. 原理:事件模型中的兩個“5”
    • “發生->響應”中的5個部分:事件的擁有者,事件的響應者,事件,事件處理器,事件訂閱
    • “發生->響應”中的5個動作:
      (1)我有一個事件
      (2)一個人或者一群人關心(即“訂閱”)我這個事件
      (3)我的這個事件發生了
      (4)關心這個事件的人會被依次通知到
      (5)被通知的人根據拿到的信息(即“事件數據”、“事件參數”、“通知”)對事件進行響應(即“事件處理”)
    1. 事件的本質是委托字段的一個包裝器。

二、事件的應用

事件模型的五個組成部分:

  1. 事件的擁有者(event source,對象)
  2. 事件(event,成員)
  3. 事件的響應者(event subscriber,對象)
  4. 事件處理器(event handler,成員)——本質上是一個回調方法
  5. 事件訂閱——把事件處理器和事件關聯在一起,本質上是一種以委托類型為基礎的“約定”
using System.Timers;
namespace EventExample
{class Program{static void Main(string[] args){System.Timers.Timer timer = new System.Timers.Timer();//1.事件的擁有者timer.Interval = 1000;Boy boy = new Boy();//3.事件的響應者//2.事件:Elapsedtimer.Elapsed += new ElapsedEventHandler( boy.Action);//5.訂閱事件timer.Start();Console.ReadLine();           }}class Boy{//4.事件處理器internal void Action(object? sender, ElapsedEventArgs e){Console.WriteLine("Jump");}}}
  • 第一種組合模式:事件的擁有者和事件的響應者是不同的對象
    在這里插入圖片描述
namespace EventExample2
{internal static class Program{static void Main(){Form form = new Form();Controller controller = new Controller(form);form.ShowDialog();}}class Controller {private Form form;public Controller(Form form ){if (form != null) {this.form = form;this.form.Click += this.FormClicked;}}private void FormClicked(object sender, EventArgs e){this.form.Text = DateTime.Now.ToString();}}
}
  • 第二種組合模式:事件的擁有者和時間的響應者是同一個對象
    在這里插入圖片描述
namespace EventExample3
{internal static class Program{static void Main(){MyForm form = new MyForm();form.Click += form.FormClicked;form.ShowDialog();}}class MyForm : Form{internal void FormClicked(object sender, EventArgs e){this.Text = DateTime.Now.ToString();}}}
  • 第三張組合模式:事件的擁有者是事件的響應者的一個字段成員

    在這里插入圖片描述

namespace EventExample4
{internal static class Program{static void Main(){MyForm form = new MyForm();           form.ShowDialog();}}class MyForm : Form{private TextBox textBox;private Button button;public MyForm(){this.textBox = new TextBox();this.button = new Button();this.button.Text = "Say Hello!";this.button.Top = 30;this.button.Click += this.ButtonClicked;this.Controls.Add(this.textBox);this.Controls.Add(this.button);}private void ButtonClicked(object sender, EventArgs e){this.textBox.Text = "Hello world!";}}}

在這里插入圖片描述

在這里插入圖片描述

訂閱的幾種寫法

 //方法一:直接掛載處理器this.button1.Click += Button1_Click;//方法二:使用委托this.button1.Click += new EventHandler(this.Button1_Click);//方法三:使用委托this.button1.Click += delegate (object? sender, EventArgs e){this.Text = DateTime.Now.ToString();};//簡寫this.button1.Click +=  (sender, e)=>{this.Text = DateTime.Now.ToString();};

三、事件的自定義聲明

完整聲明

  • 規定輸出類型和輸入參數
  • 根據規定聲明委托
  • 在事件擁有者類中聲明委托字段
  • 根據委托聲明事件
  • 訂閱事件(把委托和響應事件綁定)
  • 調用委托
    (相對于間接調用了響應事件)
namespace EventExample
{class Program{public static void Main(string[] args){Customer customer = new Customer();Waiter waiter = new Waiter();customer.Order += waiter.Action;customer.Action();customer.PayTheBill();}}public class OrderEventArgs : EventArgs{public string DishName { get; set; }public string Size { get; set; }}//聲明委托public delegate void OrderEventHandler(Customer customer, OrderEventArgs e);public class Customer{//聲明委托字段private OrderEventHandler? orderEventHandlerOrder;//聲明事件public event OrderEventHandler Order{add{this.orderEventHandlerOrder += value;}remove{this.orderEventHandlerOrder -= value;}}public double Bill { get; set; }public void PayTheBill(){Console.WriteLine("I will pay ${0}.", this.Bill);}public void WalkIn(){Console.WriteLine("Walk into the restaurant.");}public void SitDown(){Console.WriteLine("Sit down.");}public void Think(){for (int i = 0; i < 5; i++){Console.WriteLine("Let me think...");Thread.Sleep(1000);}if (this.orderEventHandlerOrder != null){OrderEventArgs e = new OrderEventArgs();e.DishName = "辣椒擂皮蛋";e.Size = "large";this.orderEventHandlerOrder.Invoke(this, e);}}public void Action(){Console.ReadLine();this.WalkIn();this.SitDown();this.Think();}}public class Waiter{internal void Action(Customer customer, OrderEventArgs e){Console.WriteLine("I will serve you the dish -{0}.", e.DishName);double price = 10;switch (e.Size){case "small":price = price * 0.5;break;case "large":price = price * 1.5;break;}customer.Bill += price;}}}

在這里插入圖片描述

簡略聲明

 public class Customer{//簡略聲明事件public event OrderEventHandler Order;....public void Think(){...if (this.Order != null){...this.Order.Invoke(this, e);}}public void Action(){...this.Think();}}

使用EventHandler聲明事件

public delegate void EventHandler(object? sender, EventArgs e);

 public class Customer{//使用EventHandler 聲明事件public event EventHandler Order;...}public class Waiter{internal void Action(Object sender, EventArgs e){//強制轉換Customer? customer = sender as Customer;OrderEventArgs? orderInfo = e as OrderEventArgs;...}}

注意:

  • 一般事件命名為××EventHandler
  • 事件參數命名為××EventArgs
  • 觸發事件命名為On××,訪問級別為protected
    修改后的代碼
 public class Customer{...this.OnOrder("辣椒擂皮蛋", "large");      }private void OnOrder(string dishName, string size) {if (this.Order != null){OrderEventArgs e = new OrderEventArgs();e.DishName = dishName;e.Size = size;this.Order.Invoke(this, e);}}...}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909968.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909968.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909968.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

青少年編程與數學 01-011 系統軟件簡介 24 Kubernetes 容器編排系統

青少年編程與數學 01-011 系統軟件簡介 24 Kubernetes 容器編排系統 一、歷史沿革&#xff08;一&#xff09;起源1. Google 內部起源 &#xff08;二&#xff09;開源后的關鍵事件&#xff08;三&#xff09;社區治理 二、技術架構&#xff08;一&#xff09;分層設計哲學&…

[C++] : 談談IO流

C IO流 引言 談到IO流&#xff0c;有些讀者可能腦海中第一個想到的C程序員的最基礎的std::cout &#xff0c; std::cin兩個類的使用&#xff0c;對的&#xff0c;這個就是一個典型的IO流&#xff0c;所以逆天我們這篇文章會基于C IO流的原理和各種應用場景進行深入的解讀。 C…

Kafka 3.0零拷貝技術全鏈路源碼深度剖析:從發送端到日志存儲的極致優化

在分布式消息系統領域&#xff0c;Kafka憑借高吞吐、低延遲的特性成為行業首選。而零拷貝技術作為Kafka性能優化的核心引擎&#xff0c;貫穿于消息從生產者發送、Broker接收存儲到消費者讀取的全生命周期。本文基于Kafka 3.0版本&#xff0c;深入源碼層面&#xff0c;對零拷貝技…

利益驅動機制下開源AI智能名片鏈動2+1模式與S2B2C商城小程序的商業協同研究

摘要&#xff1a;在數字經濟時代&#xff0c;利益驅動作為用戶行為激勵的核心邏輯&#xff0c;正通過技術創新實現模式升級。本文基于“利益驅動”理論框架&#xff0c;結合“開源AI智能名片鏈動21模式S2B2C商城小程序”的技術架構&#xff0c;系統分析物質利益&#xff08;返現…

pytest的前置后置條件

1. setUp()和tearDown() setup()函數主要是進行測試前的初始化工作&#xff0c;比如&#xff1a;在接口測試前面做一些前置的參數賦值&#xff0c;數據庫操作等等。 teardown()函數是測試后的清除工作&#xff0c;比如&#xff1a;參數還原或銷毀&#xff0c;數據庫的還原恢復…

Python 自動化運維與DevOps實踐

https://www.python.org/static/community_logos/python-logo-master-v3-TM.png 基礎設施即代碼(IaC) 使用Fabric執行遠程命令 python 復制 下載 from fabric import Connectiondef deploy_app():# 連接到遠程服務器with Connection(web-server.example.com, userdeploy,…

css3 文本效果(text-shadow、text-overflow、word-wrap、word-break)文本陰影、文本換行、文本溢出并隱藏顯示省略號

1. 文本陰影&#xff08;text-shadow&#xff09; 1.1 基本語法 text-shadow: h-shadow v-shadow blur-radius color;參數說明&#xff1a; h-shadow&#xff1a;必需。水平陰影的位置。允許負值。 正值&#xff1a;向右偏移負值&#xff1a;向左偏移 v-shadow&#xff1a;必…

在Kibana上新增Elasticsearch生命周期管理

技術文章大綱&#xff1a;在Kibana上新增Elasticsearch生命周期管理 引言 Elasticsearch索引生命周期管理&#xff08;ILM&#xff09;是管理索引從創建到刪除全周期的核心工具。通過Kibana界面配置ILM策略&#xff0c;可以自動化處理索引的滾動、收縮、凍結和刪除等操作&…

從零開始構建Python聊天機器人:整合NLP與深度學習

引言 在人工智能快速發展的今天&#xff0c;聊天機器人已經成為企業與用戶交互的重要工具。從客戶服務到信息查詢&#xff0c;從個人助手到教育輔助&#xff0c;聊天機器人的應用場景越來越廣泛。構建一個智能、高效的聊天機器人不僅需要了解自然語言處理&#xff08;NLP&…

光譜相機的多模態成像技術詳解

一、技術架構與工作原理? 多模態成像通過?同步集成多種光譜成像技術?&#xff08;如高光譜多光譜熱成像&#xff09;&#xff0c;構建“空間-光譜-時間”三維數據立方體&#xff0c;實現物質成分與動態過程的協同感知。核心架構包含&#xff1a; ?分光系統? ?液晶可調…

Spring Boot多數據源切換:三種實現方式詳解與實戰

在復雜業務系統中&#xff0c;多數據源切換已成為必備技能。本文將深入剖析三種主流實現方案&#xff0c;帶你從入門到精通&#xff01; 一、多數據源應用場景 讀寫分離&#xff1a;主庫負責寫操作&#xff0c;從庫處理讀請求 多租戶系統&#xff1a;不同租戶使用獨立數據庫 …

Kafka性能壓測報告撰寫

在大數據生態體系中&#xff0c;Kafka以其卓越的高吞吐、低延遲特性&#xff0c;成為消息隊列領域的中流砥柱。然而&#xff0c;隨著業務規模不斷擴張&#xff0c;數據流量日益激增&#xff0c;Kafka的性能表現直接關乎業務系統的穩定運行與效率提升。通過科學嚴謹的性能壓測&a…

使用DevEco Testing快速創建HarmonyOS5單元測試

1.測試環境準備 確保已安裝DevEco Studio 5.0在module的build.gradle添加依賴&#xff1a; dependencies {testImplementation org.junit.jupiter:junit-jupiter:5.8.2ohosTestImplementation com.huawei.ohos.testkit:runner:1.0.0.200 }2.創建測試類&#xff08;示例測試計…

開源物聯網(IoT)平臺對比

一些 開源物聯網&#xff08;IoT&#xff09;平臺&#xff0c;它們廣泛應用于設備管理、數據采集、遠程監控和邊緣計算等場景&#xff1a; &#x1f31f; 主流開源物聯網平臺 平臺描述技術棧許可證ThingsBoard功能豐富&#xff0c;支持設備管理、遙測數據收集、規則引擎、告警…

插值與模板字符串

背景。表單渲染需要獲取對象中屬性進行賦值操作。 插值錯誤使用。以下方舉例。其中的placeholder不能被正確渲染。因為Vue 不會解析 {{ }} 在屬性中的內容&#xff1b;如果這樣寫編譯會出問題&#xff0c;而且比較難找出是哪的問題 模板字符串。正確做法時使用。模板字符串用…

Luckfox Pico Pi RV1106學習<4>:RV1106的幀率問題

Luckfox Pico Pi RV1106學習&#xff1c;4&#xff1e;&#xff1a;RV1106的幀率問題 1. 背景2. 問題 1. 背景 接上篇。我在應用中創建3個線程&#xff1a; CAM線程&#xff0c;使用V4L2驅動&#xff0c;從 /dev/video11 獲取圖像。ENC線程&#xff0c;使用硬件編碼器&#x…

內測分發平臺應用的異地容災和負載均衡處理和實現思路?

在軟件開發過程中&#xff0c;內測分發平臺扮演著至關重要的角色。它不僅幫助開發者將應用程序傳播給內部測試人員&#xff0c;還負責收集反饋、跟蹤錯誤并改進產品。然而&#xff0c;為了確保一個平穩、連貫的內測過程&#xff0c;對內測分發平臺實施異地容災和負載均衡機制是…

國內用戶如何高效升級npm:使用阿里云鏡像加速指南

文章目錄 引言為什么需要升級npm?環境檢查使用阿里云鏡像安裝nvm配置阿里云鏡像加速npm使用nvm安裝最新Node.js驗證安裝結果升級npm到最新版本解決常見問題1. 權限問題2. 鏡像源驗證3. 項目創建失敗創建測試項目總結引言 作為前端開發者,npm(Node Package Manager)是我們日…

LeetCode--34.在排序數組中查找元素的第一個和最后一個位置

解題思路&#xff1a; 1.獲取信息&#xff1a; 給定一個非遞減順序的整數數組&#xff0c;要求找出給定元素在該數組中從左往右第一次出現的位置和最后一個出現的位置&#xff0c;即&#xff1a;最右邊的位置和最左邊的位置 如果不存在該元素&#xff0c;則返回{ -1 , -1 } 限制…

低秩分解的本質是通過基矩陣和系數矩陣的線性組合,以最小的存儲和計算代價近似表示復雜矩陣

低秩分解的本質是通過基矩陣和系數矩陣的線性組合&#xff0c;以最小的存儲和計算代價近似表示復雜矩陣 flyfish 一、最基礎起點&#xff1a;數字與數組 數字與標量&#xff08;Scalar&#xff09; 單獨的數&#xff0c;如 1 , 2.5 , ? 3 1, 2.5, -3 1,2.5,?3&#xff0c;…