Home [C# 筆記] 多重傳送委派(Multicast Delegate)
Post
Cancel

[C# 筆記] 多重傳送委派(Multicast Delegate)

「多重傳送委派(Multicast Delegate)」是單一事件引發多個事件
(多重傳送委派 可以引發 多重事件)

也就是說,一個主委派物件 可以容納多個 其他的子委派物件,當調用主委派物件,會將所有的子委派全部按序運行。

  • 通過+增加「子委派」,通過-刪除某個「子委派」
  • 多播調用的返回值 是最後一個執行委派的返回值

「多重傳送委派(Multicast-Delegate)」說穿了,你把實體化好的委派看成是一個隊列或集合,+=看成是執行Add方法,-=看成是執行Remove方法,但如果你直接用 = 號那就相當於把這個方法 直接賦值給了委派物件,會造成前面的加入進委派物件的方法被覆寫。

但是,委派有一個弊端,它可以使用「=」將所有已經訂閱的取消,只保留=後的這一個訂閱。

建立多播委派

方法一

1
2
3
4
5
6
7
//方法一:
//實體化委派 並指向一個方法 Method1()
MyDelegate myDelegate = Method1; 

//利用 多重傳送委派 將 Method2 和Method3 加入
myDelegate += Method2;
myDelegate += Method3;

方法二

1
2
3
4
5
6
7
8
//方法二:
//實體化委派 初始化為null
MyDelegate? myDelegate = null; 

//利用 多重傳送委派 將Method1(),Method2 和Method3 加入
myDelegate += Method1;
myDelegate += Method2;
myDelegate += Method3;

範例

使用「多重傳送委派(Multicast Delegate)」可以引發多重事件的特性,寫一個地震警報系統,當社區有地震時,系統會先告知此訊息,然後再觸發其他社區的住戶。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
internal class Program
{
    //宣告一個委派
    public delegate void EarthquakeDelegate();
    static void Main(string[] args)
    {
        //顯示警告訊息
        Console.WriteLine("地震系統:地震發生請社區住戶小心。");

        //實體化委派 初始化為 null
        EarthquakeDelegate? earthquakeDelegate = null;

        //利用 多重傳送委派 將HouseholdB和HouseholdC 加入
        earthquakeDelegate += HouseholdA; //驚動住戶A
        earthquakeDelegate += HouseholdB; //驚動住戶B
        earthquakeDelegate += HouseholdC; //驚動住戶C

        //叫用委派
        earthquakeDelegate();

        //也可以這樣寫:
        //實體化委派 並指向一個方法HouseholdA()
        //EarthquakeDelegate earthquakeDelegate = HouseholdA; 

        //利用 多重傳送委派 將HouseholdB和HouseholdC 加入
        //earthquakeDelegate += HouseholdB;
        //earthquakeDelegate += HouseholdC;
    }

    static void HouseholdA() { //住戶A
        Console.WriteLine("Jack: 地震來了! Vic!");
    }

    static void HouseholdB() { //住戶B
        Console.WriteLine("Vic: 天啊,地震真的來了! 搖好大啊~~~ Jack!");
    }

    static void HouseholdC() { //住戶C
        Console.WriteLine("Tim: 別再聊天啊,快逃命!!!");
    }
}

執行結果:

1
2
3
4
地震系統:地震發生請社區住戶小心。
Jack: 地震來了! Vic!
Vic: 天啊,地震真的來了! 搖好大啊~~~ Jack!
Tim: 別再聊天啊,快逃命!!!

[C# 筆記] 委派(Delegate) & 事件(Event) by R
[C# 筆記] 委派(Delegate) by R
[C# 筆記] 多播委託 Multicast-Delegate by R
[C# 筆記] 匿名方法使用委派(Delegate)

This post is licensed under CC BY 4.0 by the author.

[C# 筆記] 匿名方法使用委派(Delegate)

[ADO.NET] DataReader 和 DataSet 的使用時機?