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

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

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

委托和事件的概念

委托

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

它定義了方法的類型,使得可以將方法當作另一個方法的參數(shù)來進行傳遞,這種將方法動態(tài)地賦給參數(shù)的做法。

事件

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

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

委托和事件的作用

委托

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

事件

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

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

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

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

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

3、在注冊和注銷事件上:

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

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

委托和事件代碼實踐

委托

“中國人和外國人問候” —— 經(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>
    /// 聲明實現(xiàn)方法
    /// </summary>
    /// <param name="name"></param>
    public static void SayChinese(string name)
    {
        Console.WriteLine($"你好,{name}");
    }

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

事件

“貓叫、老鼠跑了,主人醒來了” —— 經(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ù)傳遞,消除了很多不必要的判斷,增強了程序的健壯性和可擴展性。熟練并掌握委托和事件,有助我們寫出更優(yōu)雅、易讀且性能優(yōu)越的代碼。

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

相關(guān)文章

  • C# Bitmap 復制的小例子

    C# Bitmap 復制的小例子

    這篇文章介紹了C# Bitmap 復制的小例子,有需要的朋友可以參考一下
    2013-10-10
  • Unity UGUI的ToggleGroup選項組件介紹使用

    Unity UGUI的ToggleGroup選項組件介紹使用

    這篇文章主要為大家介紹了Unity UGUI的ToggleGroup選項組件介紹使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 基于Unity3D實現(xiàn)仿真時鐘詳解

    基于Unity3D實現(xiàn)仿真時鐘詳解

    這篇文章主要為大家詳細介紹了如何利用Unity3D模擬實現(xiàn)一個簡單是時鐘效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-01-01
  • c#實現(xiàn)網(wǎng)頁圖片提取工具代碼分享

    c#實現(xiàn)網(wǎng)頁圖片提取工具代碼分享

    c#實現(xiàn)網(wǎng)頁圖片提取工具代碼分享,大家參考使用吧
    2013-12-12
  • Unity調(diào)用打印機打印圖片

    Unity調(diào)用打印機打印圖片

    這篇文章主要為大家詳細介紹了Unity通過調(diào)用打印機打印圖片的代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Unity實現(xiàn)本地文本多語言化

    Unity實現(xiàn)本地文本多語言化

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)本地文本多語言化,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • .NET垃圾回收器(GC)原理淺析

    .NET垃圾回收器(GC)原理淺析

    這篇文章主要介紹了.NET垃圾回收器(GC)原理淺析,本文先是講解了一些基礎(chǔ)知識如托管堆(Managed Heap)、CPU寄存器(CPU Register)、根(Roots)等,然后講解了垃圾回收的基本原理、算法等,需要的朋友可以參考下
    2015-01-01
  • C#設(shè)計模式之裝飾器模式實例詳解

    C#設(shè)計模式之裝飾器模式實例詳解

    本文詳細講解了C#設(shè)計模式之裝飾器模式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • C# TabControl控件中TabPage選項卡切換時的觸發(fā)事件問題

    C# TabControl控件中TabPage選項卡切換時的觸發(fā)事件問題

    這篇文章主要介紹了C# TabControl控件中TabPage選項卡切換時的觸發(fā)事件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Unity 2017使用UGUI實現(xiàn)大轉(zhuǎn)盤抽獎

    Unity 2017使用UGUI實現(xiàn)大轉(zhuǎn)盤抽獎

    這篇文章主要為大家詳細介紹了Unity 2017使用UGUI實現(xiàn)大轉(zhuǎn)盤抽獎,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02

最新評論

公主岭市| 双牌县| 天台县| 德化县| 调兵山市| 固阳县| 兴国县| 普洱| 孝感市| 安顺市| 三穗县| 新余市| 和田县| 商南县| 沁阳市| 招远市| 贵阳市| 新乡县| 永城市| 南京市| 大邑县| 浪卡子县| 武清区| 会同县| 大厂| 池州市| 句容市| 上高县| 赣州市| 海林市| 鹿邑县| 赣榆县| 阳东县| 湖州市| 台南县| 门源| 乐东| 巴彦淖尔市| 房产| 三明市| 英山县|