日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C#中委托和事件的區別詳解_C#教程

作者:黑夜中的潛行者 ? 更新時間: 2022-12-14 編程語言

委托和事件的概念

委托

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

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

事件

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

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

委托和事件的作用

委托

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

事件

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

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

委托和事件的區別

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

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

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

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

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

委托和事件代碼實踐

委托

“中國人和外國人問候” —— 經典面試題

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>
    /// 聲明委托調用方法
    /// </summary>
    /// <param name="name"></param>
    /// <param name="sayHi"></param>
    public static void CallDelegate(string name, DelegateSayHi sayHi) => sayHi(name);

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

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

事件

“貓叫、老鼠跑了,主人醒來了” —— 經典面試題

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("主人醒了");
        };
    }
}

總結

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

原文鏈接:https://blog.csdn.net/qq_43562262/article/details/127816246

欄目分類
最近更新