大纲

  • 什么是委托
  • 委托类型是怎么声明出来的
  • 泛型委托
  • 我们必需自己创建委托吗?
  • 泛型委托的类型参数判断

  • 方法与Lambda表达式之间的关系

  • 如何把一个Lambda表达式赋值给一个委托类型变量
  • 如何把一个Lambda表达式“喂”给一个委托类型参数

  • LINQ

委托

委托包裹一些方法,一个或一组函数的封装器/包装器,可替换调用函数。

常规使用

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace DelegateImprove
  7. {
  8. public delegate void MyDelegate();
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. Student student = new Student();
  14. MyDelegate myDelegate = new MyDelegate(Action);
  15. myDelegate += Action;//多播委托
  16. myDelegate += student.SayHello;
  17. myDelegate.Invoke();//同步间接调用,BegineInvoke()异步调用容易造成资源竞争
  18. }
  19. private static void Action()
  20. {
  21. Console.WriteLine("Hello World");
  22. }
  23. }
  24. class Student
  25. {
  26. public void SayHello()
  27. {
  28. Console.WriteLine("Student say hello");
  29. }
  30. }
  31. }

泛型

类型不是对象,而是对象的模板,泛型类型不是类型,而是类型的模板。
C#提供5种泛型:类,结构,接口,委托,方法
泛型的声明

Lambda表达式

  1. static void Main(string[] args) {
  2. Func<int, int, int> func = (a, b) => { return a + b; };//Lamda表达式赋值给一个委托类型的变量
  3. int res = func.Invoke(100, 200);
  4. Console.WriteLine(res);
  5. }

泛型委托的类型参数推断

泛型委托的类型推断,可以省略DoSomeCalc可以省略,100,200是标准的整型可以推断出来为int。

  1. class Program {
  2. static void Main(string[] args) {
  3. DoSomeCalc<int>((a, b) => { return a + b; }, 100, 200);
  4. //Lambda表达式 (a,b)=>{return a+b;}作为形参赋值给委托类型的变量
  5. }
  6. static void DoSomeCalc<T> (Func<T,T,T>func,T x,T y) {
  7. T res =func(x, y);
  8. Console.WriteLine(res);
  9. }
  10. }

LINQ(临时使用,需要学习SQL)

LINQ:.NET Language Integrated Query .Net运行时
书籍参考:LINQ大揭秘系列 BV1rx41157DS
EF Entity FrameWork

  1. var dbContext = new AdventureWorksEntities();
  2. var allPeople = dbContext.People.ToList();
  3. foreach(var p in allPeople){
  4. Console.WriteLine(p.FirstName);
  5. }
  6. var allPeople = dbContext.People.Select(p=>p.FirstName).ToList();
  7. var allPeople = dbContext.People.Where(p=>p.FirstName == "Timonty").Select(p=>p.FirstName).ToList();