Home [C# 筆記] Delegate 匿名函數 2
Post
Cancel

[C# 筆記] Delegate 匿名函數 2

匿名函數

寫法一:寫一個有委派參數的方法

把一個函數給一個委派
SayHi("張三", 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
//聲明一個委派類型指向一個方法
public delegate void DelSayHi(string name); //沒有返回值,一個參數
internal class Program
{
    static void Main(string[] args)
    {
        //寫法一:把一個函數給一個委派
        SayHi("張三", SayHiChinese);
        Console.ReadKey();
    }

    //我只想要調用這個方法
    public static void SayHi(string name, DelSayHi del)
    {
        del(name);
    }

    //不想調用下面兩個方法(SayHiEnglish,SayHiChinese)
    public static void SayHiEnglish(string name) {
        Console.WriteLine($"Hi, {name}");
    }
    public static void SayHiChinese(string name) {
        Console.WriteLine($"您好啊, {name}");
    }
}

寫法二:把SayHiChinese給del

寫法二:把SayHiChinese給del
用這個方式SayHi()函數就可以不要了
DelSayHi del = 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//聲明一個委派類型指向一個方法
public delegate void DelSayHi(string name); //沒有返回值,一個參數
internal class Program
{
    static void Main(string[] args)
    {
        //寫法一:把一個函數給一個委派
        //SayHi("張三", SayHiChinese);

        //寫法二:把SayHiChinese給del
        //用這個方式SayHi()函數就可以不要了
        DelSayHi del = SayHiChinese;
        del("張三");

        Console.ReadKey();
    }

    //我只想要調用這個方法
    //不用調用下面兩個方法(SayHiEnglish,SayHiChinese)
    //public static void SayHi(string name, DelSayHi del) {
    //    del(name);
    //}

    public static void SayHiEnglish(string name) {
        Console.WriteLine($"Hi, {name}");
    }
    public static void SayHiChinese(string name) {
        Console.WriteLine($"您好啊, {name}");
    }
    ```

    ### 寫法三:直接寫匿名函數
    沒有名字的函數    

    寫法三:如果我打招呼方法只會用一次  
    那我就直接寫匿名函數就好了, SayHiChinese()函數就不要了  

    ```c#
    DelSayHi del = delegate (string name) { 
        Console.WriteLine($"您好啊, {name}"); 
    };
    del("張三");
    ```

    ```c#
    //聲明一個委派類型指向一個方法
    public delegate void DelSayHi(string name); //沒有返回值,一個參數
    internal class Program
    {
        static void Main(string[] args)
        {
            //寫法一:把一個函數給一個委派
            //SayHi("張三", SayHiChinese);

            //寫法二:把SayHiChinese給del
            //用這個方式SayHi()函數就可以不要了
            //DelSayHi del = SayHiChinese;
            //del("張三");

            //寫法三:如果我打招呼方法只會用一次
            //那我就直接寫匿名函數就好了, SayHiChinese()函數就不要了
            DelSayHi del = delegate (string name) { 
                Console.WriteLine($"您好啊, {name}"); 
            };
            del("張三");

            Console.ReadKey();
        }

        //我只想要調用這個方法
        //不用調用下面兩個方法(SayHiEnglish,SayHiChinese)
        public static void SayHi(string name, DelSayHi del)
        {
            del(name);
        }

        //public static void SayHiEnglish(string name) {
        //    Console.WriteLine($"Hi, {name}");
        //}
        //public static void SayHiChinese(string name) {
        //    Console.WriteLine($"您好啊, {name}");
        //}
    }
}

Lamda表達式

寫法四:Lamda表達式
=>代表什麼:goes to

1
2
DelSayHi del = (string name) => { Console.WriteLine($"您好啊, {name}"); };
del("張三");
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
namespace 匿名函數
{
    //聲明一個委派類型指向一個方法
    public delegate void DelSayHi(string name); //沒有返回值,一個參數
    internal class Program
    {
        static void Main(string[] args)
        {
            //寫法一:把一個函數給一個委派
            //SayHi("張三", SayHiChinese);

            //寫法二:把SayHiChinese給del
            //用這個方式SayHi()函數就可以不要了
            //DelSayHi del = SayHiChinese;
            //del("張三");

            //寫法三:如果我打招呼方法只會用一次
            //那我就直接寫匿名函數就好了, SayHiChinese()函數就不要了
            //DelSayHi del = delegate (string name) { 
            //    Console.WriteLine($"您好啊, {name}"); 
            //};
            //del("張三");

            //寫法四:Lamda表達式 => goes to
            DelSayHi del = (string name) => { Console.WriteLine($"您好啊, {name}"); };
            del("張三");

            Console.ReadKey();
        }

        //我只想要調用這個方法
        //不用調用下面兩個方法(SayHiEnglish,SayHiChinese)
        public static void SayHi(string name, DelSayHi del) {
            del(name);
        }

        public static void SayHiEnglish(string name) {
            Console.WriteLine($"Hi, {name}");
        }
        public static void SayHiChinese(string name) {
            Console.WriteLine($"您好啊, {name}");
        }
    }
}
This post is licensed under CC BY 4.0 by the author.