最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中的EventHandler觀察者模式詳解

 更新時(shí)間:2022年03月15日 14:40:59   作者:細(xì)胞的理想  
這篇文章主要介紹了C#?EventHandler觀察者模式,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

C# 和 java 比較:java 中使用的是接口。C# 使用委托機(jī)制,可以用時(shí) + 運(yùn)算符進(jìn)行注冊(cè),直接多播。而 java 中是一般是使用一個(gè)集合來(lái)保存觀察者。

一、解釋

發(fā)布者(Publisher)= 被觀察者(Observable) = 事件源(java中的EventObject,C#中的sender)
訂閱者(Subscriber)=觀察者(Observer)= 接收者(java中繼承EventLister,接口, 或Observer接口, C#由于委托機(jī)制,不需要繼承接口,直接按EventHandler實(shí)現(xiàn)回調(diào)方法)

在發(fā)生其他類(lèi)或?qū)ο箨P(guān)注的事情時(shí),類(lèi)或?qū)ο罂赏ㄟ^(guò)事件通知它們。發(fā)送(或引發(fā))事件的類(lèi)稱(chēng)為“發(fā)行者”,接收(或處理)事件的類(lèi)稱(chēng)為“訂戶(hù)”。在典型的 C# Windows 窗體或 Web 應(yīng)用程序中,可訂閱由控件(如按鈕和列表框)引發(fā)的事件。可使用 Visual C# 集成開(kāi)發(fā)環(huán)境 (IDE) 來(lái)瀏覽控件發(fā)布的事件,選擇要處理的事件。IDE 會(huì)自動(dòng)添加空事件處理程序方法和訂閱事件的代碼。

EventHandler 為 C# 中的預(yù)定義委托,專(zhuān)用于表示不生成數(shù)據(jù)的事件的事件的處理程序方法。

public delegate void EventHandler(Object sender, EventArgs e)

二、事件具有以下特點(diǎn):

1. 發(fā)行者確定何時(shí)引發(fā)事件,訂戶(hù)確定執(zhí)行何種操作來(lái)響應(yīng)該事件。
2. 一個(gè)事件可以有多個(gè)訂戶(hù)。一個(gè)訂戶(hù)可處理來(lái)自多個(gè)發(fā)行者的多個(gè)事件。
3. 沒(méi)有訂戶(hù)的事件永遠(yuǎn)不會(huì)被調(diào)用。
4. 事件通常用于通知用戶(hù)操作(如:圖形用戶(hù)界面中的按鈕單擊或菜單選擇操作)。
5. 如果一個(gè)事件有多個(gè)訂戶(hù),當(dāng)引發(fā)該事件時(shí),會(huì)同步調(diào)用多個(gè)事件處理程序。要異步調(diào)用事件,請(qǐng)參見(jiàn)使用異步方式調(diào)用同步方法。
6. 可以利用事件同步線(xiàn)程。
7. 在 .NET Framework 類(lèi)庫(kù)中,事件是基于 EventHandler 委托和 EventArgs 基類(lèi)的。

實(shí)例代碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleAppEventArgs
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Publisher pub = new Publisher();
            Subscriber sub1 = new Subscriber("sub1",pub);
            Subscriber sub2 = new Subscriber("sub2", pub);
            // 調(diào)用這個(gè)方法來(lái)產(chǎn)生事件
            pub.DoSomething();
            Console.WriteLine("Press Enter to close this window.");
            Console.ReadLine();
        }
    }
    /// <summary>
    /// 自定義一個(gè)事件類(lèi)來(lái)保存事件信息
    /// </summary>
    public class CustomEventArgs : EventArgs
        public CustomEventArgs(string s)
        private string message;
        public string Message
            get { return message; }
            set { message = value; }
    /// 廣播事兒件的類(lèi)
    public class Publisher
        //使用EventHandler<T> 聲明一個(gè)事件
        public event EventHandler<CustomEventArgs> RaiseCustomEvent;
        public void DoSomething()
            //DoSomething…………
            // 你也可以再觸發(fā)事件前,執(zhí)行一些其他的代碼
            OnRaiseCustomEvent(new CustomEventArgs("Did something,hi 這是事件消息"));
        protected virtual void OnRaiseCustomEvent(CustomEventArgs  e)
            // 定義一個(gè)局部變量,已防止最后一個(gè)訂閱者剛好在檢查null后取消訂閱
            EventHandler<CustomEventArgs> handler = RaiseCustomEvent;
            // 如果沒(méi)有 訂閱者(觀察者), 委托對(duì)象將為null
            if (handler != null)
            {
                // 格式化事件消息中 的字符串
                e.Message += String.Format(" at {0}", DateTime.Now.ToString());
                // 這是最重要的一句。
                // 此時(shí)執(zhí)行的  handler已經(jīng)是一個(gè)多播委托(如果有多個(gè)訂閱者或觀察者注冊(cè))。
                // 既然是多播委托,就可以依次調(diào)用各個(gè) 回調(diào)函數(shù) (既然是回調(diào)函數(shù),實(shí)際的執(zhí)行就由訂閱者類(lèi)決定)。
                //這里面?zhèn)魅胍粋€(gè)this, 就代表 事件源(或發(fā)布者 或 被觀察者 都一個(gè)意思)
                handler(this, e);
            }
    /// 用來(lái)注冊(cè)事件的類(lèi)
    public class Subscriber
        private string id;
        public Subscriber(string ID, Publisher pub)
            id = ID;//注冊(cè)這個(gè)動(dòng)作,應(yīng)該有訂閱者主動(dòng)進(jìn)行,并且可以再后期取消注冊(cè)
            pub.RaiseCustomEvent += HandleCustomEvent;
        // 實(shí)現(xiàn)回調(diào)函數(shù)。在事件發(fā)生后,執(zhí)行什么樣的操作。這里只是簡(jiǎn)單的打印信息。
        void HandleCustomEvent(object sender, CustomEventArgs e)
            //這就是實(shí)際的操作。
            Console.WriteLine(id + " received this message: {0}", e.Message);
}

到此這篇關(guān)于C# EventHandler觀察者模式的文章就介紹到這了,更多相關(guān)C# 觀察者模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在C#中生成PDF的步驟詳解

    在C#中生成PDF的步驟詳解

    在?.NET?世界中,存在許多?PDF?庫(kù),但我們發(fā)現(xiàn),使用集成瀏覽器生成?PDF?更為簡(jiǎn)單,由于?DotNetBrowser?可以在完全脫離屏幕的情況下工作,本文給大家介紹了如何在?C#?中生成?PDF,需要的朋友可以參考下
    2024-10-10
  • 解析C#中的裝箱與拆箱的詳解

    解析C#中的裝箱與拆箱的詳解

    本篇文章是對(duì)C#中的裝箱與拆箱進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C#操作DataTable的實(shí)現(xiàn)步驟

    C#操作DataTable的實(shí)現(xiàn)步驟

    本文主要介紹了C#操作DataTable的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C#初始化數(shù)組的方法小結(jié)

    C#初始化數(shù)組的方法小結(jié)

    這篇文章主要介紹了C#初始化數(shù)組的方法,總結(jié)分析了C#聲明與初始化一維數(shù)組及多維數(shù)組的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • C# Ini文件操作實(shí)例

    C# Ini文件操作實(shí)例

    這篇文章主要介紹了C# Ini文件操作實(shí)例,需要的朋友可以參考下
    2014-02-02
  • c# WPF中自定義加載時(shí)實(shí)現(xiàn)帶動(dòng)畫(huà)效果的Form和FormItem

    c# WPF中自定義加載時(shí)實(shí)現(xiàn)帶動(dòng)畫(huà)效果的Form和FormItem

    這篇文章主要介紹了c# WPF中自定義加載時(shí)實(shí)現(xiàn)帶動(dòng)畫(huà)效果的Form和FormItem,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#獲取Word文檔中所有表格的實(shí)現(xiàn)代碼分享

    C#獲取Word文檔中所有表格的實(shí)現(xiàn)代碼分享

    這篇文章主要介紹了C#獲取Word文檔中所有表格的實(shí)現(xiàn)代碼分享,小編親測(cè)可用,需要的朋友可以參考下
    2014-09-09
  • c# 實(shí)現(xiàn)簡(jiǎn)單的串口通訊

    c# 實(shí)現(xiàn)簡(jiǎn)單的串口通訊

    這篇文章主要介紹了c# 如何實(shí)現(xiàn)簡(jiǎn)單的串口通訊,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#將Json解析成DateTable的方法

    C#將Json解析成DateTable的方法

    這篇文章主要介紹了C#將Json解析成DateTable的方法,涉及相關(guān)格式轉(zhuǎn)換的操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • C#飛行棋小程序設(shè)計(jì)代碼

    C#飛行棋小程序設(shè)計(jì)代碼

    這篇文章主要為大家詳細(xì)介紹了C#飛行棋小程序設(shè)計(jì)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11

最新評(píng)論

西林县| 开阳县| 句容市| 靖安县| 屏东县| 上思县| 庄河市| 桃江县| 扎囊县| 西丰县| 韶关市| 东乡族自治县| 延长县| 新化县| 陇南市| 光泽县| 六盘水市| 崇明县| 屏南县| 钟山县| 保康县| 多伦县| 曲阳县| 洪江市| 淅川县| 沭阳县| 通渭县| 商洛市| 临泽县| 罗定市| 年辖:市辖区| 罗江县| 临江市| 容城县| 巴塘县| 进贤县| 龙胜| 婺源县| 砚山县| 房产| 汉中市|