委托
匿名类是没有名字的类。特点:匿名类不能被引用,只能在创建时用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 }