委托

匿名类是没有名字的类。特点:匿名类不能被引用,只能在创建时用new语句来声明。

一.委托的概念

    委托是用户自定义的类,它定义了方法的类型。储存的是一系列具有相同参数和返回类型方法的地址列表,调用委托时,此委托列表的所有方法都将被执行。

二.委托类型的定义

委托类型必须在被用来创建变量以及类型对象之前声明。

委托类型的声明:

1.以delegate关键字开头。

2.返回类型+委托类型名+参数列表

在C#中使用一个类分为两个阶段。
首先,定义这个类,告诉编译器这个类是由什么字段和方法组成的。
然后,使用这个类实例化对象。
在使用委托的过程中,也需要经历着两个阶段。
首先,定义委托,告诉编译器这个委托可以指向哪些类型的方法,然后,创建该委托的实例。

 1         //定义一个 无返回值的 无参数的委托
 2         public delegate void ShowDelegate();
 3         //定义一个 无返回值的 有参数的 委托
 4         public delegate void Show2Delegate(string msg);
 5         //定义一个 有返回值的 有参数的 委托
 6         public delegate string Show3Delegate(string msg);
 7         //定义一个用来测试多播委托的 委托
 8         public delegate void PrintLogDelegate(string log);
 9         public DelegateTest()
10         {
11             Console.WriteLine("=====委托的第一种赋值方式  new=====");
12             ShowDelegate ds = new ShowDelegate(Show);
13             ds();//委托的第一种调用方式
14             ds.Invoke();//委托的第2种调用方式
15             Console.WriteLine("=====委托的第2种赋值方式  直接赋值=====");
16             Show2Delegate ds_2 = Show2;
17             ds_2.Invoke("委托的赋值  直接赋值");//显示调用
18             Console.WriteLine("=====委托的第3种赋值方式  匿名方法=====");
19             Show2Delegate sd_3 = (msg) =>
20             {
21                 Console.WriteLine(msg);
22             };
23             sd_3.Invoke("委托的赋值  匿名方法");
24             Console.WriteLine("=====委托的第4种赋值方式  委托变量声明之后使用+=、-=    =====");
25             Show2Delegate sd_4 = null;
26             sd_4 += Show2;
27             sd_4 += (msg) => { Console.WriteLine("匿名方法赋值:"+msg); };
28             sd_4.Invoke("委托变量声明之后使用+=、-= ");
29 
30 
31             Console.WriteLine();
32             Console.WriteLine();
33             Console.WriteLine();
34             Show2Delegate ds2 = new Show2Delegate(Show2);
35             ds2("这是一个有参数的委托");
36             ds2("委托的隐式调用");
37             ds2.Invoke("委托的显示调用");
38             Console.WriteLine("====调用有返回值 有参数的委托========");
39             Show3Delegate sd3 = new Show3Delegate(Show3);
40             //接收委托的返回值
41             string str =  sd3.Invoke("这是有返回值 有参数的委托的测试");
42             Console.WriteLine(str);
43 
44             Console.WriteLine("==============多播委托====================");
45             PrintLogDelegate printLog = null;
46             printLog += Print1;
47             printLog += Print2;
48             printLog += Print3;
49             //调用
50             printLog.Invoke("多播委托的测试");
51 
52             printLog -= Print3;
53             printLog.Invoke("多播委托的测试_去掉一个方法");
54 
55 
56             Console.ReadKey();
57 
58         }
59 
60 
61         public void Print1(string log)
62         {
63             Console.WriteLine("Print1:" + log);
64         }
65         public void Print2(string log)
66         {
67             Console.WriteLine("Print2:" + log);
68         }
69         public void Print3(string log)
70         {
71             Console.WriteLine("Print3:" + log);
72         }
73         public void Show()
74         {
75             Console.WriteLine("我是具体的方法实现");
76         }
77         public void Show2(string msg)
78         {
79             Console.WriteLine("Show2:" + msg);
80         }
81 
82         public string Show3(string msg)
83         {
84             return "返回:" + msg;
85         }
86     }
87 }
原文地址:https://www.cnblogs.com/lujingBK/p/11172459.html