【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 }
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 }

浙公网安备 33010602011771号