C# lambda 编译成什么?堆栈框架,匿名类型的实例,还是?

2023-12-07

C# lambda 编译成什么?堆栈框架,匿名类型的实例,还是?

我读过这个question。这主要回答了“为什么”在使用隐式类型功能时不能使用 lambda。但是,这个问题旨在回答编译器生成什么构造来实际执行 lambda 代码。它是匿名类型的方法调用(类似于在 Java 中实现接口的匿名类型?),还是只是一个引用封闭变量并接受参数签名的堆栈框架?一些 lambda 不会关闭任何内容——因此编译会产生 2 个不同的结果输出。


假设您的意思是“作为委托”,那么它仍然取决于 :p 如果它捕获任何变量(包括“this”,这可能是隐式的),那么这些变量实际上被实现为编译器生成的类型上的字段(不公开在任何地方) ),并且语句主体成为该捕获类上的方法。如果存在多个捕获级别,则外部捕获又是内部捕获类上的字段。但本质上:

int i = ...
Func<int,int> func = x => 2*x*i;

Is like;

var capture = new SecretType();
capture.i = ...
Func<int,int> func = capture.SecretMethod;

Where:

class SecretType {
    public int i;
    public int SecretMethod(int x) { return 2*x*i; }
}

这与“匿名方法”相同,但语法不同。

请注意,不捕获状态的方法可以实现为没有捕获类的静态方法。

另一方面,表达式树...解释起来比较棘手:p

但是(我手头没有编译器,所以请耐心等待):

int i = ...
Expression<Func<int,int>> func = x => 2*x*i;

是这样的:

var capture = new SecretType();
capture.i = ...
var p = Expression.Parameter("x", typeof(int));  
Expression<Func<int,int>> func = Expression.Lambda<Func<int,int>>(
    Expression.Multiply(
        Expression.Multiply(Expression.Constant(2),p),
        Expression.PropertyOrField(Expression.Constant(capture), "i")
    ), p);

(除了使用不存在的“memberof”构造,因为编译器可以作弊)

表达式树很复杂,但可以解构和检查 - 例如转换为 TSQL。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# lambda 编译成什么?堆栈框架,匿名类型的实例,还是? 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co

随机推荐

  • 使用 REGEX 用可变长度零填充数字

    我遇到一种情况 客户端输入一个数字 我需要通过在其前面填充一定数量的零来验证该数字 我验证的字段的最大长度是 9 位数字 因此如果客户端输入 123 我需要在其前面填充 6 个零并进行验证 听起来很容易 对吧 好吧 这是最关键的 我对过程的
  • Codeigniter 连接模型中的两个表

    我想在我的模型中加入 2 个表 但它不起作用 这是我现在的模型 function list get id this gt load gt database query this gt db gt get where lists array
  • 如何使用 GET/POST 和 Token key 基于 Ajax 调用 ASP.NET Web API

    我知道如何将 Ajax 与 GET POST 数据一起使用 如下代码所示 但我不知道如何将其与 Token key 一起使用 已获得 Token key read1 click function support cors true ajax
  • C++ 未声明的标识符错误

    我得到一个未声明的标识符错误 我不知道为什么 我什至重写了完整的内容以确保我没有犯错 有人能告诉我为什么会出现这个错误吗 我的文件是 连接 hpp pragma once include LogicSimulator hpp include
  • 如何使用 thymeleaf 递归渲染菜单

    我想使用 ul li 列表呈现 HTML 菜单 我有这个类结构 public class MenuItem private String name private MenuItem parent private List
  • ASP.NET MVC:出现空 ActionLink

    我使用默认路由 因此不需要指定控制器 routes MapRoute Default action id new controller Home action Index id UrlParameter Optional 有了这个 我可以创
  • 在 C 中传递二维指针数组

    对于我的程序 我需要将一个二维指针数组传递给单独文件中的函数 我在下面编写了一个类似语法的文件 include
  • 使用 py2exe 捆绑时导入错误

    我使用 py2exe 捆绑了一个用 python 编写的小脚本 该脚本使用了许多包 其中之一是reportlab 使用 py2exe 捆绑后 我尝试运行可执行文件 但它返回以下错误 C Python26 dist gt DELchek ex
  • 在Python中调用C函数并返回2个值

    我试图弄清楚如何从我在 python 中调用的 C 函数返回 2 个值 我已阅读在线材料并使用 struct 输出这两个变量 当我在同一个 C 文件中调用此函数时 我能够输出变量 然而 当我尝试在 python 中调用它时 它仍然只返回一个
  • 外部存储上应用程序特定文件夹的权限

    有人可以解释一下应用程序特定文件夹的权限吗 Android data lt package name gt files 如此处所述http developer android com guide topics data data stora
  • 处理字母数字字符时 ksort 会产生错误的结果

  • 是否可以从获取的 url 而不是规范的 url 中提取元数据?

    我有一个像这样的 Facebook 链接到我没有完全控制权的页面 我可以修改但不是页面的 因此 我尝试在我拥有完全控制权的新页面上设置 like 按钮的链接 在此页面上设置opengraph元标记 并设置一个链接到原始页面的og url 但
  • 如何捕获全局异常?

    有没有办法捕捉global代码中的 崩溃 应用程序异常 例如 objc exception throw EXC ARITHMETIC 等 我需要它 因为我想在应用程序被系统杀死之前做一些事情 您可以使用以下方法为任何未捕获的异常设置处理程序
  • MySQL查询从一个表中获取最佳排名并用另一个表更新结果

    我有一个排名板 列出了每种性别 男性和女性 的前 100 个最佳博客 我有一个博客表 PRIMARY blogs id users id blogs score blogs score time gender 1 11 2852 2015
  • 如何使用天蓝色连接字符串覆盖本地连接字符串

    我在 Net core 项目中使用 appsettings json 作为连接字符串 我的连接字符串是 ConnectionStrings OT DB Connection Data Source 108 Initial Catalog O
  • 运行 Composer Laravel 8 时出现 Symfony 进程错误

    突然在我的 Laravel 8 项目中 我运行了 Composer 来卸载一个依赖项 我想重新安装该依赖项 只是为了顺序并从头开始 我开始抛出这个与 Symfony Process 有关的错误 PHP 致命错误 未捕获的类型错误 fclos
  • 如何将每个 DStream 保存/插入到永久表中

    我一直面临着 Spark Streaming 的问题 关于将输出 Dstream 插入到永恒的SQL 表 我想将每个输出 DStream 来自 Spark 处理的单个批次 插入到一个唯一的表中 我一直在使用 Python 和 Spark 版
  • 在Java中禁用键盘/鼠标

    我正在开发一个程序 它允许用户锁定计算机 这样其他人就不能使用它 无论如何 我可以禁用鼠标和键盘上的特定键吗 谢谢 不 但是您可以创建让程序锁定屏幕 然后使用 MouseMovementListener 以便每次鼠标移动时 您都以编程方式将
  • 使用 Javascript 选定单词的索引

    如何使用 Javascript 获取 HTML 中选定文本的索引 例如 在一个 HTML 文件中 有如下段落 我住在印度 印度是一个非常美丽的国家 现在如果用户选择India在第一句话中应该有一个alert 5如果用户选择India第二行然
  • C# lambda 编译成什么?堆栈框架,匿名类型的实例,还是?

    C lambda 编译成什么 堆栈框架 匿名类型的实例 还是 我读过这个question 这主要回答了 为什么 在使用隐式类型功能时不能使用 lambda 但是 这个问题旨在回答编译器生成什么构造来实际执行 lambda 代码 它是匿名类型