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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...