Lamdba
前置知识:
- Lamdba的演变过程--》
匿名方法: 没有 方法名称的方法 并且可以直接访问局部变量- 在.NET Framework1.0中 实例委托必须要给委托传递一个方法 方法返回值 参数必须与委托一致
- 在.NET Framework2.0中 实例化委托迎来了简写:匿名方法 需要加上delegate关键字
-
//定义一个有参数 有返回值的委托Public delegate int MyDelegate(int x, int y);//实例一个委托 MyDelegate method=new MyDelegate(delegate (int x,int y)){ return 2; } -
.在.NET Framework3.0中 直接把delegate关键字去掉了 使用 goesto 来替代
MyDelegate method=(int x,int y)=>return 1;
匿名类:类型中的内容只能在初始化中赋值,不能修改 他是只读的;-
Dynamic:
声明一个不指定具体类型的类 ,因为C#是强类型语言,编译时 编译器会确定类型 是编译器不允许的 导致无法直调用,可以使用 Dynamic关键字 避开编译器检查; - Var:
Var是一个语法糖 ,由编译器自动推算类型 - Var 是一个匿名类型:编译器分配名称 `a
- var 必须赋值 :因为他需要推算类型
-
var 是3.5新出的一个定义变量的类型,其实也就是弱化类型的定义,VAR可代替任何类型
编译器会根据上下文来判断你到底是想用什么类型的,
至于什么情况下用到VAR ,我想就是你无法确定自己将用的是什么类型,
就可以使用VAR 类似 OBJECT 但是效率比OBJECT高点。
或者通俗的讲:
var可以理解为匿名类型,我们可以认为它是一个声明变量的占位符。
它主要用于在声明变量时,无法确定数据类型时使用。
使用var定义变量时有以下四个特点:
1. 必须在定义时初始化。也就是必须是var s = “abcd”形式,而不能是如下形式: var s; s = “abcd”;
2. 一但初始化完成,就不能再给变量赋与初始化值类型不同的值了。
3. var要求是局部变量。
4. 使用var定义变量和object不同,它在效率上和使用强类型方式定义变量完全一样。
-
-
- 扩展方法
- 定义:
- 在静态类中 的一个静态方法里面 第一个参数前面加一个 this
扩展方法
//静态类 public static DoNoting { //静态方法 public void DonotingMethod(this Student s) { cw("我是扩展方法"); } } Student s=new Student(); //调用时我们既可以直接静态调用 DoNoting.DonotingMethod(s); //又可以使用扩展方法的形式调用 s.DonotingMethod();- 扩展方法就像扩展了类的逻辑
- 第三方的类,不适合修改源码,可以通过扩展方法增加逻辑
- 他会优先调用实例方法 :类型中有一个名称和扩展方法名称一致的方法
- .netcore中: 扩展方法适合组件化开发
- 定义接口 类时 是按照最小需求,但是在开发时经常需要一些 扩展方法去处理逻辑
- .netcore中的 Context.Reponse.WriteAsync
- 中间件注册 Build.Use,UseWhen, UseWhere, Run
- 定义:
1.什么是Lamdba表达式
- 解释:
- Lamdba是实例委托的参数
- 这个参数就是一个方法 可以是匿名的
- Lamdba是一个匿名方法
- 编译时会生成一个名称为 <>开头的方法
- 并且还会生成一个 密封类 在类中包含所所有的lamdba 以<>开头的方法
- 多播委托中的特殊的Lamdba
- Lamdba表达式在多播委托中是无法移除的
- 为什么不能被移除
- Lamdba方法 是在一个密封类中定义的 以<>开头的方法
- 移除时需要具体方法名称 但是匿名方法没有名称 无法移除
- 虽然直接移除的带方法体的匿名方法 但是 和你真的要移除的方法不是同一个方法
- 也就是说 因为是同一个密封类中的两个方法 ,所以无法移除

浙公网安备 33010602011771号