欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中委托和事件的區(qū)別詳解

 更新時(shí)間:2022年11月17日 15:11:15   作者:黑夜中的潛行者  
C# 中的委托(Delegate)類似于 C 或 C++ 中函數(shù)的指針。事件是在委托類型變量前加上 event 關(guān)鍵字,其本質(zhì)是用來(lái)對(duì)委托類型的變量進(jìn)行封裝,類似于類的屬性對(duì)字段的封裝。本文就來(lái)聊聊C#中委托和事件的區(qū)別,感興趣的可以了解一下

委托和事件的概念

委托

C# 中的委托(Delegate)類似于 C 或 C++ 中函數(shù)的指針。委托(Delegate) 是存有對(duì)某個(gè)方法的引用的一種引用類型變量。引用可在運(yùn)行時(shí)被改變。它本質(zhì)上也是一個(gè)類。

它定義了方法的類型,使得可以將方法當(dāng)作另一個(gè)方法的參數(shù)來(lái)進(jìn)行傳遞,這種將方法動(dòng)態(tài)地賦給參數(shù)的做法。

事件

事件由對(duì)象引發(fā),通過(guò)我們提供的代碼來(lái)處理。一個(gè)事件我們必須訂閱(Subscribe)他們,訂閱一個(gè)事件的含義就是提供代碼,在這個(gè)事件發(fā)生時(shí)執(zhí)行這些代碼,這些代碼稱為事件處理程序。

事件是在委托類型變量前加上 event 關(guān)鍵字,其本質(zhì)是用來(lái)對(duì)委托類型的變量進(jìn)行封裝,類似于類的屬性對(duì)字段的封裝。

委托和事件的作用

委托

可以把方法當(dāng)參數(shù)傳遞,可以避免在程序中大量使用 if-else(switch) 語(yǔ)句,同時(shí)使得程序具有更好的可擴(kuò)展性。C#2.0 之后出現(xiàn)了 匿名函數(shù) 和 lambda表達(dá)式 也是 Delegate 演化而來(lái)。

事件

事件的使用一般通過(guò)發(fā)布者和訂閱者來(lái)進(jìn)行。發(fā)布者會(huì)在某一條件下觸發(fā)某事件,訂閱者可以通過(guò)訂閱該事件,來(lái)對(duì)該事件的觸發(fā)做出反應(yīng)。

在設(shè)計(jì)模式中的訂閱者模式是最佳實(shí)踐。

委托和事件的區(qū)別

1、事件是委托的封裝 —— 是一種特殊的委托。(初學(xué)時(shí)已經(jīng)了解)

2、事件里面其實(shí)就是兩個(gè)方法(即 add_event() 和 remove_event())和一個(gè)私有的委托變量,這兩個(gè)方法里面分別是對(duì)這個(gè)私有的委托變量進(jìn)行的合并和移除,當(dāng)調(diào)用事件的 += 時(shí)其實(shí)是調(diào)用的事件里面的 add_event() 方法,同樣 -= 調(diào)用的是 remove_event() 方法。

3、在注冊(cè)和注銷事件上:

委托可以使用 = 和 += 來(lái)將函數(shù)注冊(cè)到委托的變量上,使用 -= 來(lái)將函數(shù)注銷。

事件則有著更嚴(yán)格的限制,事件只能使用 += 來(lái)將函數(shù)注冊(cè)到其上,使用 -= 來(lái)將函數(shù)注銷。

委托和事件代碼實(shí)踐

委托

“中國(guó)人和外國(guó)人問(wèn)候” —— 經(jīng)典面試題

internal class Program
{
    static void Main(string[] args)
    {
        CallDelegate("王二狗", SayChinese);
        CallDelegate("Tom", SayEnglish);
    }

    /// <summary>
    /// 聲明委托
    /// </summary>
    /// <param name="name"></param>
    public delegate void DelegateSayHi(string name);
    /// <summary>
    /// 聲明委托調(diào)用方法
    /// </summary>
    /// <param name="name"></param>
    /// <param name="sayHi"></param>
    public static void CallDelegate(string name, DelegateSayHi sayHi) => sayHi(name);

    /// <summary>
    /// 聲明實(shí)現(xiàn)方法
    /// </summary>
    /// <param name="name"></param>
    public static void SayChinese(string name)
    {
        Console.WriteLine($"你好,{name}");
    }

    /// <summary>
    /// 聲明實(shí)現(xiàn)方法
    /// </summary>
    /// <param name="name"></param>
    public static void SayEnglish(string name)
    {
        Console.WriteLine($"Hello,{name}");
    }
}

事件

“貓叫、老鼠跑了,主人醒來(lái)了” —— 經(jīng)典面試題

internal class Program
{
    static void Main(string[] args)
    {
        Mouse();
        People();
        Scream();
    }

    /// <summary>
    /// 聲明委托
    /// </summary>
    public delegate void DelegateScream();

    /// <summary>
    /// 聲明事件
    /// </summary>
    public static event DelegateScream OnScream;

    public static void Scream()
    {
        Console.WriteLine("貓叫了一聲");
        OnScream?.Invoke();
    }

    public static void Mouse()
    {
        OnScream += () =>
        {
            Console.WriteLine("老鼠跑了");
        };
    }

    public static void People()
    {
        OnScream += () =>
        {
            Console.WriteLine("主人醒了");
        };
    }
}

總結(jié)

事件是一種特殊的委托,事件的最佳實(shí)踐為訂閱者模式。委托可以將函數(shù)作為參數(shù)傳遞,消除了很多不必要的判斷,增強(qiáng)了程序的健壯性和可擴(kuò)展性。熟練并掌握委托和事件,有助我們寫出更優(yōu)雅、易讀且性能優(yōu)越的代碼。

到此這篇關(guān)于C#中委托和事件的區(qū)別詳解的文章就介紹到這了,更多相關(guān)C#委托 事件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • WPF實(shí)現(xiàn)3D粒子波浪效果

    WPF實(shí)現(xiàn)3D粒子波浪效果

    這篇文章主要為大家詳細(xì)介紹了WPF實(shí)現(xiàn)3D粒子波浪效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C#/VB.NET實(shí)現(xiàn)在Word中插入或刪除腳注

    C#/VB.NET實(shí)現(xiàn)在Word中插入或刪除腳注

    腳注,是可以附在文章頁(yè)面的最底端的,對(duì)某些東西加以說(shuō)明,印在書頁(yè)下端的注文。這篇文章將為您展示如何通過(guò)C#/VB.NET代碼,以編程方式在Word中插入或刪除腳注,需要的可以參考一下
    2023-03-03
  • C#基礎(chǔ)入門之值類型和引用類型的區(qū)別詳析

    C#基礎(chǔ)入門之值類型和引用類型的區(qū)別詳析

    在C#中值類型的變量直接存儲(chǔ)數(shù)據(jù),而引用類型的變量持有的是數(shù)據(jù)的引用,數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)堆中,下面這篇文章主要給大家介紹了關(guān)于C#基礎(chǔ)入門之值類型和引用類型區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • unity scrollRect實(shí)現(xiàn)按頁(yè)碼翻頁(yè)效果

    unity scrollRect實(shí)現(xiàn)按頁(yè)碼翻頁(yè)效果

    這篇文章主要為大家詳細(xì)介紹了unity scrollRect實(shí)現(xiàn)按頁(yè)碼翻頁(yè)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C#和lua相互調(diào)用的方法教程

    C#和lua相互調(diào)用的方法教程

    lua是一種腳本語(yǔ)言,可以方便的移植到各種宿主語(yǔ)言中,并且可以支持熱更新,在游戲開(kāi)發(fā)中也能當(dāng)做主要的語(yǔ)言來(lái)編寫游戲的邏輯,所以這篇文章主要給大家介紹了關(guān)于C#和lua相互調(diào)用的方法教程,需要的朋友可以參考下。
    2017-11-11
  • C#請(qǐng)求http向網(wǎng)頁(yè)發(fā)送接收數(shù)據(jù)的方法

    C#請(qǐng)求http向網(wǎng)頁(yè)發(fā)送接收數(shù)據(jù)的方法

    這篇文章主要為大家詳細(xì)介紹了C#請(qǐng)求http向網(wǎng)頁(yè)發(fā)送數(shù)據(jù)、網(wǎng)頁(yè)接收的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • C# 中屬性PropertyInfo的setvalue用法說(shuō)明

    C# 中屬性PropertyInfo的setvalue用法說(shuō)明

    這篇文章主要介紹了C# 中屬性PropertyInfo的setvalue用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • Unity實(shí)現(xiàn)俄羅斯方塊(三)

    Unity實(shí)現(xiàn)俄羅斯方塊(三)

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)俄羅斯方塊的第一部分代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C#實(shí)現(xiàn)將文件轉(zhuǎn)換為XML的方法

    C#實(shí)現(xiàn)將文件轉(zhuǎn)換為XML的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)將文件轉(zhuǎn)換為XML的方法,實(shí)例分析了office文件與xml的相互轉(zhuǎn)換技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-12-12
  • C#實(shí)現(xiàn)控制電腦注銷,關(guān)機(jī)和重啟

    C#實(shí)現(xiàn)控制電腦注銷,關(guān)機(jī)和重啟

    這篇文章主要為大家介紹了C#如何實(shí)現(xiàn)控制電腦注銷,關(guān)機(jī)和重啟功能,本案例涉及的知識(shí)點(diǎn)包含:Process、Shell32.dll、User32.dll、Struct數(shù)據(jù)結(jié)構(gòu),感興趣的可以了解一下
    2022-09-09

最新評(píng)論