首页 > 编程语言 >C#委托和闭包实现方式

C#委托和闭包实现方式

时间:2023-12-18 16:58:51浏览次数:26  
标签:闭包 变量 委托 C# 捕获 lua 编译器

在底层,编译器会为委托生成一个类,这个类包含了每一个闭包所捕获的变量作为它的一个公有字段。这也是为什么闭包捕获的变量的生命周期和委托的一致的原因。

具体可以看:https://blog.csdn.net/zhudaokuan/article/details/113032690

总的来说,C#中的委托和闭包的底层原理都与编译器如何处理这两种结构有关。编译器会为委托和闭包生成特殊的类和方法,以实现它们的功能

扩展:lua的闭包

lua闭包:https://www.cnblogs.com/mcyushao/p/17478562.html

lua闭包是直接在函数原型中建一个数组,存闭包(被捕获的变量)

如何保证闭包捕获的变量不会被释放?

1.lua在栈中建了一个容器用来存所有的闭包(让所有闭包都有引用,函数原型中的闭包数组存的是这个容器的key)。

2.c#将所有被捕获的变量封到一个匿名类中(值类型装箱),构建实例并找个东西引用着(引用类型只要有人引用就不会被释放)。这个实例在闭包执行完毕后消除引用并回收。

 

标签:闭包,变量,委托,C#,捕获,lua,编译器
From: https://www.cnblogs.com/mcyushao/p/17904111.html

相关文章

  • ClickHouse(18)ClickHouse集成ODBC表引擎详细解析
    目录创建表用法示例资料分享参考文章ODBC集成表引擎使得ClickHouse可以通过ODBC方式连接到外部数据库.为了安全地实现ODBC连接,ClickHouse使用了一个独立程序clickhouse-odbc-bridge.如果ODBC驱动程序是直接从clickhouse-server中加载的,那么驱动问题可能会导致ClickHouse服......
  • 安防监控视频管理平台EasyCVR v3.4版如何取消首次登录强制重置密码的操作?
    在视频监控领域,智慧安防平台EasyCVR平台采用了开放式的网络结构,支持高清视频的接入和传输、分发,能提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力,此外,高清可视化视频监控平台EasyCVR......
  • SpringSession+SpringSecurity中如何保存Authentication到Session中的Attribute
     org.springframework.security.web.context.SecurityContextPersistenceFilter#doFilter(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse,javax.servlet.FilterChain) org.springframework.security.web.context.HttpSessionSecurityC......
  • webservice接口的调用
    1.添加web引用:找到服务的url(网址) 输入好url后点击添加引用注意:.asmx链接引用时是添加web引用?wsdl链接引用时添加service引用2.代码调用WebReference.WebService1webtest=newWebReference.WebService1();webtest.GDXF2("sss"); ......
  • 数据结构与算法 第二章线性表(48课时课程笔记)Data Structure and Algorithms
    2.1线性表的类型定义一个线性表是n个数据元素的有限序列。 (1)结构初始化 InitList(&L) 构造一个空的线性表L。(2)销毁结构 DestroyList(&L)(3)引用型操作  (4)修改型操作  一个算法举例:假设有两个集合A和B分别用两个线性表LA和LB表示(即:线性表中的数据元素即为集......
  • class sun.reflect.GeneratedConstructorAccessor2 cannot access its superclass sun
    在启动JFinal程序时报错classsun.reflect.GeneratedConstructorAccessor2cannotaccessitssuperclasssun.reflect.Constructor问题所在因为这个项目的原作者是使用eclipse编写的,idea和eclipse的启动机制不一样,由于eclipse并没有自动实现热加载机制,因此这里我们需要加上......
  • 安全帽AI识别算法在LiteCVR智慧工地解决方案中的应用
    智慧工地是利用物联网、云计算、大数据等先进技术来优化和管理工地施工过程的一种新型施工模式。视频监控在智慧工地中发挥着重要的作用。LiteCVR视频监控系统可以实时监测工地的人员和设备,及时发现安全隐患。例如,监控摄像头可以检测到工人是否佩戴安全帽,是否按规定操作,以及工地是......
  • C# TrackBar控件使用
    Maximum属性:用来获取或设置TrackBar控件可表示的范围上限,即最大值。Minimum属性:用来获取或设置TrackBar控件可表示的范围下限,即最小值。SmallChange属性:用来获取或设置当滑块短距离移动时对Value属性进行增减的值。Value属性:用来获取或设置滑块在跟踪条控件上的当前位置的值。-......
  • ThreadLocal阅读
    ThreadLocal阅读目录ThreadLocal阅读ThreadLocalMap细究ThreadLocalMapgetEntrysetremoveThreadLocalMap其他的细节ThreadLocalSuppliedThreadLocalTerminatingThreadLocalInheritableThreadLocal首先基于ThreadLocal的简单使用场景,梳理一下下面三个的类之间的关系:ThreadThre......
  • 在控制台下使用委托和事件
    我们都知道,C#中有“接口”这个概念,所谓的“接口”就是定义一套标准,然后由实现类来具体实现其中的方法,所以说“接口,是一组类的抽象”。同样道理,我们可以将“委托”理解为“方法的抽象”,也就是说定义一个方法的模板,至于这个方法具体是怎么样的,就由方法自己去实现。 我们知道接口......