C#教程 - Lambda Expressions
2022/9/17 14:16:13
本文主要是介绍C#教程 - Lambda Expressions,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
更新记录
转载请注明出处:https://www.cnblogs.com/cqpanda/p/16690958.html
2022年9月17日 发布。
2022年9月10日 从笔记迁移到博客。
Lambda Expressions说明
在匿名函数的基础上删除delegate关键字
在参数列表和函数体之间添加=>符号
语法:
(parameters) => expression-or-statement-block
实例:
实例:
delegate int Transformer (int i); Transformer sqr = x => x * x;
更简化的Lambda
Lambda本质
Lambda表达式最终会转为delegate instance或者expression tree
编译器转换实现
本质上编译器通过编写私有方法并将Lambda表达式的代码移到该方法中来解析
在编译器内部,lambda表达式会被转为类型的private方法
编译器会将Lambda表达式转为:
一个委托的实例(A delegate instance)
一个表达式树(expression tree, of type Expression
如果有捕获的外部变量,则转为类的私有字段进行处理
捕获外部变量(Capturing Outer Variables)
说明
Variables can also be captured by anonymous methods and local methods
注意:变量的捕获发生在运行阶段
简单捕获变量
A lambda expression that captures variables is called a closure
实例:
static void Main() { int factor = 2; Func<int, int> multiplier = n => n * factor; Console.WriteLine (multiplier (3)); // 6 }
被捕获变量调用时间
捕获变量会在lambda方法被调用的时候才会被引用,而不是在lambda表达式定义的时候
实例:
int factor = 2; Func<int, int> multiplier = n => n * factor; factor = 10; Console.WriteLine (multiplier (3)); // 30
实例:最终输出333
Action[] actions = new Action[3]; for (int i = 0; i < 3; i++) { actions [i] = () => Console.Write (i); } foreach (Action a in actions) a(); // 333
实例:最终输出012
Action[] actions = new Action[3]; for (int i = 0; i < 3; i++) { int loopScopedi = i; actions [i] = () => Console.Write (loopScopedi); } foreach (Action a in actions) a(); // 012
捕捉for迭代变量(Capturing iteration variables)
When you capture an iteration variable in a for loop,
C# treats the iteration variable as though it were declared outside the loop
注意:foreach没有这个问题(C# 5.0+)
实例:
Action[] actions = new Action[3]; for (int i = 0; i < 3; i++) actions [i] = () => Console.Write (i); foreach (Action a in actions) a(); // 333
如果非要捕获for循环中的当时的值,可以使用临时变量(temporary variable)
实例:
Action[] actions = new Action[3]; for (int i = 0; i < 3; i++) { int loopScopedi = i; actions [i] = () => Console.Write (loopScopedi); } foreach (Action a in actions) a(); // 012
Lambda表达式与本地方法(Lambda Expressions Versus Local Methods)
比较
本地方法可以是递归的,自己调用自己
本地方法可以避免指定委托类型的混乱
本地方法的开销稍微少一点
匿名方法(Anonymous Methods)
Lambda表达式与匿名方法比较
Lambda表达式有隐式类型(参数Implicitly typed parameters)
Lambda表达式有表达式语法(Expression syntax)
匿名方法必须有语句块(statement block)
Lambda表达式可以编译为表达式树(expression tree, by assigning to Expression
匿名方法可以完全省略参数声明
实例
实例:
delegate int Transformer (int i); Transformer sqr = delegate (int x) {return x * x;}; Console.WriteLine (sqr(3)); // 9
实例:省略参数声明
public event EventHandler Clicked = delegate { };
实例:事件监听函数使用匿名方法
// Notice that we omit the parameters: Clicked += delegate { Console.WriteLine ("clicked"); };
实例:Using Lambda Expressions as Data
persons.Where(person => person.Name.ToUpper() == "INIGOMONTOYA");
Anonymous Function Terminology plication
Lambda表达式与编译器
Lambda expressions (and anonymous methods) are not intrinsically built in to the CLR
Rather, when the compiler encounters an anonymous function
it translates it into special hidden classes, fields, and methods that implement the desired semantics
The C# compiler generates the implementation code for this pattern so that developers do not have to code it themselves
The Lambda Expression Tree Type
分类
表达式式
实现
x=>x
语句式
实现
(int x) = > { return x;}
这篇关于C#教程 - Lambda Expressions的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具