C#-委托 lambda 匿名方法 匿名类型

1.lambda 匿名方法 匿名类型
 
   
  1. delegate void d1();
  2. d1 d = delegate(){Console.WriteLine("this is a test");}; //使用匿名方法
  3. d1 d += ()=>{Console.WriteLine("this_test2");}; //使用lambda表达式
  4. var q1 = new {name= "jing",age=25}; //匿名类型必须和var配合用
  5. var q2 = from c in a where c.age <20 select new {c.name,c,age = 21}; //匿名类型必须和var配合用
  6. var q3 = a.Where(c => c.age<20).Select(c=>c.name) //lambda表达式必须在linq 的投影语法中,lambda后面可以使用匿名类型,因为前面有var

匿名方法是委托常用方法的简化
lambda表达式是匿名方法的简化
他们都是包装了委托的意义,但是传递的其实都是方法,特别是有特色的lambda表达式,简化的写法有返回值
可以直接用需要返回值方法的地方
可以直接这样理解:因为lambda表达式传递的是方法,所以要么赋给其他委托来执行,要么放在可以执行方法的地方直接执行(这样返回的就是return回来的东西)

委托里面是方法的引用(指针),把委托给事件,就是把方法的引用给了事件

Eventdelegate的抽象和封装,Event提供了安全的方法向delegate对象添加和删除方法

C#定义的三个泛型委托

Func<Tint,Tout> 有参数0-16个,有返回值 

Predicate<T>    有参数1个,有bool返回值

Action<T>          有参数0-16个,无返回值 

 
    
  1. static void Main(string[] args)
  2. {
  3. var arr = new List<int>() { -1, -2, -3, 0, 1, 2, 3, 4, 5, 6 };
  4. var d1 = new Predicate<int>(More);
  5. var d2 = new Predicate<int>(Less);
  6. var a1 = new Func<int,string>(Speak);
  7. string aa = a1(1123);
  8. Console.WriteLine(aa);
  9. Print(arr, d1);
  10. Print(arr, d2);
  11. Console.WriteLine("已经全部打印完了,请指示下一步操作");
  12. Console.ReadKey();
  13. }
  14. static string Speak(int i)
  15. {
  16. return (i ).ToString();
  17. }
  18. static void Print(List<int> aa, Predicate<int> dl)
  19. {
  20. foreach (var item in aa)
  21. {
  22. if (dl(item))
  23. {
  24. Console.WriteLine(item);
  25. }
  26. }
  27. }
  28. static bool More(int i)
  29. {
  30. if (i > 0)
  31. {
  32. return true;
  33. }
  34. return false;
  35. }
  36. static bool Less(int i)
  37. {
  38. if (i < 0)
  39. {
  40. return true;
  41. }
  42. return false;
  43. }
  44. }

委托的一个实例

 
    
  1. delegate void Speak(int i ); // 声明一个委托
  2. spike jy = new spike(); // 声明一个对象
  3. jy.lower += speak; // 给委托附加方法
  4. jy.lower += delegate { Console.WriteLine("this is very crazy man!"); }; // 给委托添加匿名方法
  5. jy.lower += (int i )=> Console.WriteLine("sadjfoisajfdoijsadofjodsaj");//匿名方法lambda表达式方式写法
  6. jy.to(10);

我记得委托 +=的时候会覆盖前一个方法的,为什么在执行的时候没有覆盖前一个方法?

我好像记得有一个地方是这样的,但是委托确实是多赋方法,一次运行多个方法的







转载于:https://www.cnblogs.com/weloveshare/p/5325831.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值