C# 委托和事件(二):使用.Net框架中的EventArgs和EventHandler

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

前面一篇里提到事件是通過委托來進行關聯的,而委托是可以帶各種各樣的參數的,其中就可以用事件參數(EventArgs),同時,也可以用.Net框架裡邊提供的一個委托EventHandler來Handle事件。 一樣,搞一個場景(這個場景是書里的):買車。經銷商(CarDealer)會上新車(NewCa ...


前面一篇里提到事件是通過委托來進行關聯的,而委托是可以帶各種各樣的參數的,其中就可以用事件參數(EventArgs),同時,也可以用.Net框架裡邊提供的一個委托EventHandler來Handle事件。

一樣,搞一個場景(這個場景是書里的):買車。經銷商(CarDealer)會上新車(NewCar)事件,這個事件會由買車的顧客(Comsumer)訂閱,一旦有新車出來他們就會來光顧。在這裡,由於需要詳細的車的信息,所以使用前面提到的不帶參數的方法就比較麻煩,我們重新定義一個委托(delegate)和事件參數(EventArgs)。

1、事件參數(CarInfoEventArgs)

從.Net提供的EventArgs里派生出來,包含車輛名字的屬性

public class CarInfoEventArgs : EventArgs
{
    public string Car { get; private set; }

    public CarInfoEventArgs(string car)
    {
        this.Car = car;
    }
}

2、事件(NewCarInfo)

這裡使用.Net自帶的委托EventHandler來聲明一個事件,相應的,這個事件的處理程式就必須使用這個委托對應的參數來構建

public event EventHandler<CarInfoEventArgs> NewCarInfo;

註意,這是一個泛型委托,在這裡指定了參數的類型為CarInfoEventArgs,EventHandler的定義如下:

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e)
    where TEventArgs : EventArgs

可以看到這個委托包含兩個參數:一個object類型,一個泛型參數,並且這個泛型參數被限製為EventArgs或EventArgs派生的類型

3、完整的對象

CarDealer

public class CarDealer
{
    public event EventHandler<CarInfoEventArgs> NewCarInfo;

    // 觸發事件
    public void NewCar(string car)
    {
        Console.WriteLine($"CarDealer, new car {car}");
        if (NewCarInfo != null)
        {
            NewCarInfo(this, new CarInfoEventArgs(car));
        }
    }
}

Consumer

public class Consumer
{
    public string Name { get; private set; }

    public Consumer(string name)
    {
        this.Name = name;
    }

    public void NewCarIsHere(object sender, CarInfoEventArgs e)
    {
        Console.WriteLine($"{name}: car {e.Car} is new");
     }
}

4、具體的實現

public class Program
{
    static void Main()
    {
        var dealer = new CarDealer();

        var michael = new Consumer("Michael");
        dealer.NewCarInfo += michael.NewCarIsHere;

        dealer.NewCar("Mercedes");
            
        var nick = new Consumer("Nick");
        dealer.NewCarInfo += nick.NewCarIsHere;

        dealer.NewCar("Ferrari");

        dealer.NewCarInfo -= michael.NewCarIsHere;
        dealer.NewCar("Toyota");
    }
}

執行結果如下:

 


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

-Advertisement-
Play Games
更多相關文章
  • 字元設備是3大類設備(字元設備、塊設備和網路設備)中較簡單的一類設備,其驅動程式中完成的主要工作是初始化、添加和刪除cdev結構體,申請和釋放設備號,以及填充 file_operations結構體中的操作函數,實現file_operations結構體中的read()、write()和ioctl()等... ...
  • 問題描述:在Windows10下安裝Ubuntu。 使用工具:Windows10、Ubuntu16.04 LTS安裝包、UltraISO、easyBCD。 操作步驟: 1、安裝之前要給Ubuntu分出一定大小的磁碟空間。我用170G來安裝Ubuntu。我的硬碟比較大,如果硬碟較小,可以選擇50G等大 ...
  • 問題概述:在裝系統的時候有時候並不能一下分出完全符合我們使用習慣的分區大小,我們可能需要在後期調整分區大小。以下是有關分區大小調整的操作。 使用工具:Windows磁碟管理工具。 操作步驟: 1、使用組合鍵win+x,彈出菜單,選中“電腦管理”,選擇“磁碟管理”。 2、這裡簡要說明一下Window ...
  • 問題概述:因為在自己學習Linux的時候,按照網上的教程錯誤的刪除了Ubuntu的一個內核驅動,導致Ubuntu不能啟動。我想到的辦法是重新安裝系統,重裝系統的第一步便是將Ubuntu從電腦中卸載。該筆記是有關如何刪除Ubuntu啟動項的。 使用工具:Windows10,Ubuntu16.04 LT ...
  • NAND FLASH是一個存儲晶元 那麼: 這樣的操作很合理"讀地址A的數據,把數據B寫到地址A" 問1. 原理圖上NAND FLASH和S3C2440之間只有數據線, 怎麼傳輸地址? 答1.在DATA0~DATA7上既傳輸數據,又傳輸地址 當ALE為高電平時傳輸的是地址, ... ...
  • Linux設備模型是對系統設備組織架構進行抽象的一個數據結構,旨在為設備驅動進行分層、分類、組織。降低設備多樣性帶來的Linux驅動開發的複雜度,以及設備熱拔插處理、電源管理等。 ...
  • 之前沒怎麼註意,在使用下載盒通過isp下載stm32時,由於是通過stm32板子給下載盒供電,所以是我的stm32板子和下載盒同時上電。這樣總是不能夠進入下載模式,後來對下載盒進行模擬,發現在下載發送了7F之前,下載盒已經收到了一個位元組,導致在判斷首位元組時出錯。 後來就先把下載和給去了,直接把串口接 ...
  • 在2.1、欄目的前臺顯示中因右鍵沒有添加視圖把微軟給鄙視了一下,後來有仔細研究了一下發現應該鄙視自己,其實這個功能是有的,是自己沒搞清楚亂吐糟。 其實只要在NuGet中安裝兩個包(Microsoft.VisualStudio.Web.CodeGeneration.Tools和Microsoft.Vi... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...