委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

 

使用委托:

    1、定义委托类型

    [访问修饰符]delegate 返回类型 委托名(形参)

    2、声明委托对象

    委托名 委托实例名

    3、创建委托对象

    委托实例名 = new 委托名(某个类的方法)

    4、使用委托调用方法

    委托实例名(实参)

 

delegate

  最少0个参数,最多32个参数

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6  
 7 namespace Delete
 8 {
 9     public delegate void GreetHandler(string name); //声明委托
10     class Program
11     {
12         static void Main(string[] args)
13         {
14             //最简单的调用
15             {
16                 //GreetHandler greet = new GreetHandler(new Greeting().EnglishGreeting);
17                 //greet("Tom");
18                 //greet = new GreetHandler(new Greeting().ChineseGreeting);
19                 //greet("张三");
20             }
21  
22             //调用委托
23             {
24                 //new Greeting().GreetPeople("Tom", new Greeting().EnglishGreeting);
25                 //new Greeting().GreetPeople("张三", new Greeting().ChineseGreeting);
26             }
27  
28             //多播委托
29             {
30                 GreetHandler greet = new GreetHandler(new Greeting().EnglishGreeting);
31                 greet += new GreetHandler(new Greeting().ChineseGreeting);
32                 greet("张三");
33             }
34         }
35  
36     }
37  
38  
39  
40     public class Greeting
41     {
42         public void EnglishGreeting(string name)
43         {
44             Console.WriteLine(name + ",Morning");
45         }
46  
47         public void ChineseGreeting(string name)
48         {
49             Console.WriteLine(name + ",早上好");
50         }
51  
52         public void GreetPeople(string name, GreetHandler makeGreeting)
53         {
54             makeGreeting(name);
55         }
56  
57     }
58  
59 }

 

Action

  用于没有返回值的方法(至少0个参数,最多16个参数)

Func

  用于由返回值的方法(至少0个参数,最多16个参数)

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6  
 7 namespace Delete
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             //<>内可以定义多个参数
14             {
15                 Action<int, int> action = new Action<int, int>(new Compute().Add);
16                 action(1, 2);
17             }
18  
19             {
20                 //<>内最后一个为返回值的类型
21                 Func<int, int, int> func = new Func<int, int, int>(new Compute().Minus);
22                 int result = func(5, 3);
23                 Console.WriteLine(result);
24             }
25         }
26  
27     }
28  
29     public class Compute
30     {
31         public void Add(int a, int b)
32         {
33             Console.WriteLine(a + b);
34         }
35  
36         public int Minus(int a, int b)
37         {
38             return a - b;
39         }
40  
41  
42     }
43  
44  
45 }

 

posted on 2018-04-23 08:05  幻影K  阅读(121)  评论(0)    收藏  举报