Home [C# 筆記] Delegate 委派語法
Post
Cancel

[C# 筆記] Delegate 委派語法

委派概念

  • 聲明一個委派指向一個函數
  • 委派所指向的函數必須跟委派具有相同的簽名

跟創建執行緒很像,都是傳入一個方法
Thread t = new Thread(SayHiChinese);

委派基本語法

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
namespace 委派概念
{
    //聲明一個委派指向一個函數
    //委派所指向的函數必須跟委派具有相同的簽名
    public delegate void DelegateSayHi(string name);//沒有返回值,但有傳入一個參數

    internal class Program
    {
        static void Main(string[] args)
        {
            //Test("張三",)

            //用中文打招呼,若要用英文打招呼改成SayHiEnglish
            DelegateSayHi del = new DelegateSayHi(SayHiChinese); //用英文打招呼
            //跟創建執行緒很像,都是傳入一個方法
            //Thread t = new Thread(SayHiChinese); 

            del("張三");
            Console.ReadKey();
        }

        //我只調這個函數,如果我想用中文打招呼,他就去調用中文打招呼方法,反之,用英文,就調英文
        public static void Test(string name, DelegateSayHi delegateSayHi)
        {
            //調用
            delegateSayHi(name);
        }

        //這兩個方法都做差不多的事
        public static void SayHiChinese(string name) { //中文打招呼
            Console.WriteLine($"吃了什麼?{name}");
        }
        public static void SayHiEnglish(string name) { //英文打招呼
            Console.WriteLine($"Nice to meet you{name}");
        }
    }
}

還沒完…

仔細看,這樣有意義嗎?
我還要創建對象new委派,怎不直接調用打招呼方法?

1
DelegateSayHi del = SayHiChinese; //new DelegateSayHi(SayHiEnglish);

既然我可以將方法賦值給委派類型,那我就可以不用寫這段,我直接在Test傳入啦,
因為Test裡有一個delete類型 可以傳入方法

1
2
3
4
5
6
7
8
9
10
static void Main(string[] args) {
    //DelegateSayHi del = SayHiChinese;//new DelegateSayHi(SayHiEnglish);

    //我最終目的是只調用Test函數,不調用下面那兩個函數
    //那既然我可以直接將方法傳給委派類型
    //那我函數中有委派類型的參數,我就直接調用傳入方法就可以啦
    Test("張三", SayHiChinese);
    Test("張三", SayHiEnglish);
    Console.ReadKey();
}

現在成功的將函數當做參數傳給了Test()

  • 函數可以賦值給一個委派

但是,還是沒什差異~~~
跟我直接調用兩個打招呼方式一樣啊???
SayHiChinese(“張三”);
SayHiEnglish(“張三”);

這時候還是看不出委派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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
namespace 委派概念
{
    //聲明一個委派指向一個函數
    //委派所指向的函數必須跟委派具有相同的簽名
    public delegate void DelegateSayHi(string name);//沒有返回值,但有傳入一個參數

    internal class Program
    {
        static void Main(string[] args)
        {
            //Test("張三",)

            //仔細看,這樣有意義嗎?
            //我還要創建對象new委派,怎不直接調用打招呼方法?
            //既然我可以將方法賦值給委派類型,
            //那我就可以不用寫這段,我直接在Test傳入啦
            //因為Test裡有一個delete類型 可以傳入方法
            //DelegateSayHi del = SayHiChinese;//new DelegateSayHi(SayHiEnglish);
            //跟創建執行緒很像,都是傳入一個方法
            //Thread t = new Thread(SayHiChinese); 

            //del("張三");

            //我最終目的是只調用Test函數,不調用下面那兩個函數
            //那既然我可以直接將方法傳給委派類型
            //那我函數中有委派類型的參數,我就直接調用傳入方法就可以啦
            Test("張三", SayHiChinese);
            Test("張三", SayHiEnglish);

            //但是,還是沒什差異~~~
            //跟我直接調用兩個打招呼方式一樣啊 ???
            //SayHiChinese("張三");
            //SayHiEnglish("張三");

            Console.ReadKey();
        }

        //我最終目的是只調用Test函數,不調用下面那兩個函數
        //我只調這個函數,如果我想用中文打招呼,他就去調用中文打招呼方法,反之,用英文,就調英文
        public static void Test(string name, DelegateSayHi delegateSayHi)
        {
            //調用
            delegateSayHi(name);

        }

        //這兩個方法都做差不多的事
        public static void SayHiChinese(string name) {
            Console.WriteLine($"吃了什麼{name}");
        }
        public static void SayHiEnglish(string name) {
            Console.WriteLine($"Nice to meet you{name}");
        }
    }
}
This post is licensed under CC BY 4.0 by the author.