【C#】委托中的匿名函数与lambda

将方法作为方法的参数

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

将方法绑定到委托

第一次用的“=”,是赋值的语法;第二次,用的是“+=”,是绑定的语法。如果第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误。

既然给委托可以绑定一个方法,那么也应该有办法取消对方法的绑定,很容易想到,这个语法是“-=”:

使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。

下面是一个委托, 匿名函数, lambda表达式的示例

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace DennisDemos.DemosHelper
 8 {
 9     //定义了一个从System.Delegate类派生的类
10     //也可以理解为一种数据类型 这种数据类型指向返回值为void 参数为Person对象的函数
11     //我们也可以把Person类理解为一种数据类型 只是它包含的是Name和Age
12     public delegate void EatFoodDelegate(Person p);
13 
14     public class Person
15     {
16 
17         public string Name { get; set; }
18 
19         public int Age { get; set; }
20 
21         public Person(string name, int age)
22         {
23             Name = name;
24             Age = age;
25         }
26 
27         //既然委托是一数据类型和String一样,所以可以像声明String对象一样声明代理变量
28         public EatFoodDelegate eatFoodDelegate;
29         ////之前是直接声明委托,现在是声明一个事件
30         //public event EatFoodDelegate EatFoodEventHandler;
31 
32         public void eating()
33         {
34 
35             if (eatFoodDelegate != null)
36             {
37                 eatFoodDelegate(this);
38             }
39         }
40 
41     }
42 }
Person 类
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using DennisDemos.DemosHelper;
 7 
 8 namespace DennisDemos.Demos
 9 {
10     public class DelegateDemo
11     {
12         /// <summary>
13         /// chineseEat 实际上是一个独立的方法, 需要和委托变量关联起来, 但是程序运行过程中, chineseEat实际上只被调用了一次. 
14         /// 对于程序比较复杂的代码来说, 这种情况会使得代码的结构比较混乱, 而且可读性比较差.
15         /// 因此对于那种在程序运行中只调用一次的委托方法, 建议使用 匿名方法的方式去调用.
16         /// 匿名方法 , 顾名思义就是说方法没有名字. 所以这种匿名方法必须在定义的时候进行调用. 并没有重用性.
17         /// </summary>
18         public void Run()
19         {
20             Person chinesePerson = new Person("小明", 25);
21             //普通委托示例
22             chinesePerson.eatFoodDelegate += new EatFoodDelegate(chineseEat); // += 将方法注册到委托当中.
23             chinesePerson.eating();
24 
25             Console.WriteLine("--------------------------------------");
26 
27             //使用匿名函数示例
28             EatFoodDelegate EnglishEatPisaDelegate = delegate (Person p)
29             {
30                 Console.WriteLine("I'm {0},I am {1} , I eat PiSa", p.Name, p.Age);
31             };
32 
33             Person englishPerson = new Person("Ivan", 25);
34             englishPerson.eatFoodDelegate = delegate (Person p)
35             {
36                 Console.WriteLine("I'm {0},I am {1} , I eat MianBao", p.Name, p.Age);
37             };
38             englishPerson.eatFoodDelegate += EnglishEatPisaDelegate;
39             englishPerson.eating();
40 
41             Console.WriteLine("--------------------------------------");
42 
43             //lambda示例
44             Person lambdaPerson = new Person("lambda", 25);
45             lambdaPerson.eatFoodDelegate = (Person p) => {
46                 Console.WriteLine("I'm {0},I am {1} , I eat MianBao1", p.Name, p.Age);
47             };
48             lambdaPerson.eatFoodDelegate += (Person p) => {
49                 Console.WriteLine("I'm {0},I am {1} , I eat PiSa1", p.Name, p.Age);
50             };
51             lambdaPerson.eating();
52             Console.ReadLine();
53         }
54         static void chineseEat(Person p)
55         {
56             Console.WriteLine("我是{0},我今年{1}岁了,我吃馒头", p.Name, p.Age);
57         }
58     }
59 }
DelegateDemo

 

posted @ 2018-04-15 23:01  YanyuWu  阅读(163)  评论(0)    收藏  举报