大纲
- 什么是委托
- 委托类型是怎么声明出来的
- 泛型委托
- 我们必需自己创建委托吗?
泛型委托的类型参数判断
方法与Lambda表达式之间的关系
- 如何把一个Lambda表达式赋值给一个委托类型变量
如何把一个Lambda表达式“喂”给一个委托类型参数
LINQ
委托
委托包裹一些方法,一个或一组函数的封装器/包装器,可替换调用函数。
常规使用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DelegateImprove
{
public delegate void MyDelegate();
class Program
{
static void Main(string[] args)
{
Student student = new Student();
MyDelegate myDelegate = new MyDelegate(Action);
myDelegate += Action;//多播委托
myDelegate += student.SayHello;
myDelegate.Invoke();//同步间接调用,BegineInvoke()异步调用容易造成资源竞争
}
private static void Action()
{
Console.WriteLine("Hello World");
}
}
class Student
{
public void SayHello()
{
Console.WriteLine("Student say hello");
}
}
}
泛型
类型不是对象,而是对象的模板,泛型类型不是类型,而是类型的模板。
C#提供5种泛型:类,结构,接口,委托,方法
泛型的声明
Lambda表达式
static void Main(string[] args) {
Func<int, int, int> func = (a, b) => { return a + b; };//Lamda表达式赋值给一个委托类型的变量
int res = func.Invoke(100, 200);
Console.WriteLine(res);
}
泛型委托的类型参数推断
泛型委托的类型推断,可以省略DoSomeCalc
class Program {
static void Main(string[] args) {
DoSomeCalc<int>((a, b) => { return a + b; }, 100, 200);
//Lambda表达式 (a,b)=>{return a+b;}作为形参赋值给委托类型的变量
}
static void DoSomeCalc<T> (Func<T,T,T>func,T x,T y) {
T res =func(x, y);
Console.WriteLine(res);
}
}
LINQ(临时使用,需要学习SQL)
LINQ:.NET Language Integrated Query .Net运行时
书籍参考:LINQ大揭秘系列 BV1rx41157DS
EF Entity FrameWork
var dbContext = new AdventureWorksEntities();
var allPeople = dbContext.People.ToList();
foreach(var p in allPeople){
Console.WriteLine(p.FirstName);
}
var allPeople = dbContext.People.Select(p=>p.FirstName).ToList();
var allPeople = dbContext.People.Where(p=>p.FirstName == "Timonty").Select(p=>p.FirstName).ToList();