闭包在幕后是如何工作的? (C#)

2023-12-06

我觉得我对闭包、如何使用它们以及它们何时有用有相当不错的理解。但我不明白的是它们实际上是如何在内存中幕后工作的。一些示例代码:

public Action Counter()
{
    int count = 0;
    Action counter = () =>
    {
        count++;
    };

    return counter;
}

通常,如果闭包未捕获 {count},则其生命周期将限定在 Counter() 方法内,并且在完成后,它将与 Counter() 的堆栈分配的其余部分一起消失。当它关闭时会发生什么?这次 Counter() 调用的整个堆栈分配是否保留?它是否将 {count} 复制到堆中?它是否实际上从未在堆栈上分配,但被编译器识别为已关闭,因此始终存在于堆上?

对于这个特定问题,我主要感兴趣的是它在 C# 中的工作原理,但不反对与支持闭包的其他语言进行比较。


你的第三个猜测是正确的。编译器会生成如下代码:

private class Locals
{
  public int count;
  public void Anonymous()
  {
    this.count++;
  }
}

public Action Counter()
{
  Locals locals = new Locals();
  locals.count = 0;
  Action counter = new Action(locals.Anonymous);
  return counter;
}

合理?

另外,您还要求进行比较。 VB 和 JScript 都以几乎相同的方式创建闭包。

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

闭包在幕后是如何工作的? (C#) 的相关文章

  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 引用的程序集自动由 Visual Studio 替换

    我有 2 个项目 一个可移植类库和一个常规单元测试项目 在可移植类库中 我使用 NuGet 来引用 Microsoft BCL 可移植包 它附带 2 个程序集 System Threading Tasks dll and System Ru
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 如何在C#中提取rar文件?

    我想使用 cmd shell 提取 rar 文件 所以我编写了以下代码 string commandLine c progra 1 winrar winrar e c download TestedU rar c download Proc
  • xpath 不包含 A 和 B

    我怎样才能添加not contains facebook not contains twitter 到我的xpath sites selector xpath h3 class r a href not contains google hr
  • 我可以在哪里获取我的通用应用程序的客户端密钥?

    I m following this guide http msdn microsoft com library windows apps hh465407 to implement push notifications on my app
  • 有没有办法让 Go 的通道表现得像堆栈

    据我所知 默认情况下 Go 通道的行为类似于队列 先进先出 有什么办法可以将它们更改为后进先出吗 基本上 我正在进行搜索 并希望出于内存限制而使用 DFS 而不是 BFS 不 这是不可能的 通道始终是 FIFO 你可以使用包containe
  • 如何增加 OpenGL 缓冲区?

    是否可以在 OpenGL 中增加缓冲区 假设我想使用实例渲染 每次在世界上产生一个新对象时 我都必须使用实例化数据更新缓冲区 在本例中 我有 3 个浮点数的缓冲区 std vector
  • 如何通过镜头让玩家被摧毁?

    我在通过摄像机让玩家被摧毁时遇到了一些麻烦 在我的应用程序中 我让相机跟随玩家 球 但摄像机只能跟随球向上 所以我想要完成的是 当玩家 球 到达界面 屏幕 的底部时 它就会被摧毁 当它被摧毁后 如果弹出一个新的活动 新屏幕 那就太好了 那就
  • Sql server 2008 - 插入大量数据的性能调整功能

    我必须将大量数据插入表中 sqlserver 2008 与 2005 相比 是否有任何新功能可以提高这种情况下的性能 SQL Server 2008 包含MERGETSQL 语句可以加速某些类型的组合 INSERT UPDATE 和 DEL
  • Android 拆分操作栏,操作项位于顶部和底部?

    有没有办法将某些操作项指定到拆分操作栏的顶部 而其他操作项指定到底部 或者是全有或全无 即所有操作项仅进入拆分的底部 目前这是不可能的 请参阅 Android 开发者 Reto Meier 和 Roman Nurik 在 Android 开
  • 类方法和实例方法的区别?

    当我在编程中使用实例方法和类方法时 我总是感到困惑 请告诉我实例方法和类方法之间的区别以及彼此的优点 所有其他答案似乎都被错误的标签所捕获 现已修复 在 Objective C 中 实例方法是当消息发送到类的实例时调用的方法 因此 例如 i
  • 使用 Flexbox 包裹元素

    我刚刚完成了弹性盒课程并且正在练习 所以如果答案涉及弹性盒概念 我将不胜感激 我有 2 个文章元素 我希望第二篇文章始终位于该位置 第一篇文章的文本可以放在它下面 但是 目前每篇文章的大小都受到尊重 我该如何解决这个问题 这是我当前的 HT
  • 是否可以使用 SQL 中的“Where”子句仅显示仅包含字母和数字的字段?

    我希望能够仅选择某个字段同时包含字母和数字的字段 例如 Select field1 field2 from db1 table1 where field2 LETTERS AND NUMBERS 我使用的是 SQL Server 2005
  • 从 iCloud 备份中排除文件

    我使用的是 iOS 5 1 我使用这种和平的代码 pathURL setResourceValue NSNumber numberWithBool YES forKey NSURLIsExcludedFromBackupKey error
  • 在 Codeblocks 中设置 GLUT 项目 (Ubuntu 12.04)

    我通过 apt get 安装了 freeglut3 和 freeglut3 dev 我想在 Codeblocks 中创建一个 OPENGL GLUT 项目 有人问我 GLUT 的位置 我输入了 usr 正如我在教程中找到的那样 但我收到错误
  • 使用活动记录进行计数/分组?

    我有一张包含以下信息的表 id user id points 1 12 48 2 15 36 3 18 22 4 12 28 5 15 59 6 12 31 etc 我想要的是每个 user id 包含最多条目的前 10 个 数组 顺序从高
  • 列表视图选择如何改变事件的工作方式。它叫了两次

    我有列表视图控件 在更改选择时 我会检查 如果所选记录计数大于零 则仅启用组框控件 否则将其禁用 因为 这些控件仅与选定的记录相关 如果没有选择记录 则不应启用它 以下是我的列表视图的选定更改事件 Private Sub lv Select
  • Play 2.5 对某些请求禁用csrf保护

    我正在使用 play Framework v 2 5 3 编写我的应用程序 并使用官方文档中所述的 CSRF 保护 public class Filters implements HttpFilters Inject CSRFFilter
  • 是否可以在循环中创建并行的 Jenkins 声明式管道阶段?

    我的项目中的不同子项目有一个长期运行的 Gradle 任务列表 我想使用 Jenkins 声明式管道并行运行它们 我希望这样的事情可能会起作用 projects a b c pipeline stage Deploy parallel fo
  • GMailApp Gmail 搜索

    我有一个问题GmailApp搜索 查询 功能 根据它使用的手册Gmail 查询 因此所有参数都应该可访问并返回正确的结果 这是我的查询 var sent threads GmailApp search in sent after 2016
  • SVG animateTransform 同时旋转和缩放同一对象?

    我想同时对缩放和旋转对象进行动画处理 到目前为止 我的尝试失败了 我只能链接动画 旋转 然后缩放 但不能一起旋转和缩放 我错过了什么 我尝试删除 additive sum 但这只是覆盖并忽略了缩放动画
  • 闭包在幕后是如何工作的? (C#)

    我觉得我对闭包 如何使用它们以及它们何时有用有相当不错的理解 但我不明白的是它们实际上是如何在内存中幕后工作的 一些示例代码 public Action Counter int count 0 Action counter gt count