C#lambda编译成什么?一个栈帧,一个匿名类型的实例,或者?C#lambdas编译成什么?一个栈帧,一个匿名类型的实例,或者?我读过这个问题。这主要回答了“为什么”在使用隐式类型函数时不能使用lambda。但是,这个问题的目的是回答编译器生成的实际执行lambda代码的结构。它是对匿名类型的方法调用(类似于Java中实现接口的匿名类型?),还是只是一个引用闭包变量并接受参数签名的堆栈框架?一些lambda不关闭任何东西——所以在编译中有两个不同的结果输出。假设你的意思是“作为一个委托”,那么它仍然取决于:p如果它捕获任何变量(包括“this”,这可能是隐含的)那么这些变量实际上是作为编译器生成的类型的字段实现的(不在任何地方公开),语句的主体成为捕获类的方法。如果有多个捕获级别,则外层捕获也是内层捕获类的一个字段。但基本上:inti=...Funcfunc=x=>2*x*i;仿佛;varcapture=newSecretType();capture.i=...Funcfunc=capture.SecretMethod;其中:classSecretType{publicinti;publicintSecretMethod(intx){返回2*x*i;这与“匿名方法”相同,但语法不同。请注意,不捕获状态的方法可以作为没有捕获类的静态方法来实现。另一方面,表达式树……更难解释:p但是(我没有编译器,所以请耐心等待):inti=...Expression>func=x=>2*x*i;像这样:varcapture=newSecretType();capture.i=...varp=Expression.Parameter("x",typeof(int));表达式>func=Expression.Lambda>(Expression.Multiply(Expression.Multiply(Expression.Constant(2),p),Expression.PropertyOrField(Expression.Constant(capture),"i")),p);(除了使用不存在的“memberof”构造,因为编译器可以作弊)表达式树非常复杂,但可以解构和检查-例如转换为TSQL。Lambda表达式确实是匿名函数,但功能更多。这两篇MSDN文章有很多关于lambda表达式的信息,如何使用它们,运算符=>有什么优先级,它们与匿名函数的关系,以及一些高级使用建议。Lambda表达式(MSDN)=>运算符(MSDN)以下是一些示例:publicclassC{privateintfield=0;publicvoidM(){intlocal=0;函数f1=()=>0;//f1是一个引用CFuncf2=()=>this.中编译器生成的静态方法的委托。场地;//f2是一个委托,它引用C中编译器生成的实例方法Funcf3=()=>local;//f3是一个委托,它引用C中编译器生成的嵌套类的实例方法}}lambda表达式是一种未命名的方法,它取代了委托。编译器将其转换为:所以编译器解析lambda表达式,将表达式的代码移动到私有方法中。以上就是C#学习教程:C#lambda编译成什么?一个栈帧,一个匿名类型的实例,或者?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
