许多语言中有闭包的概念,C#的闭包以lambda表达式表现,可以实现与LUA完全一样的效果。

//LUA------------------------------------------------
function test()
     local i =
     return function () -- 匿名函数
          i = i +
          return i
     end
end
 
c1 = test()//一般情况下,函数是使用栈来存储变量i的,出了函数后i会被释放
c2 = test()//一般情况下,函数是使用栈来存储变量i的,出了函数后i会被释放
//出了test()的作用域,再测试test()中的局部变量i是否仍然正常运作
print(c1(), c1)
print(c2(), c2)
print(c1(), c1)
print(c2(), c2)
//输出
function: 00C9BA00
function: 00C9B780
function: 00C9BA00
function: 00C9B780
//C#---------------------------------------------------
1 delegate int CN();
static CN test()
{
int i = ;
CN cn = () => { return i = i + ; }; return cn;
}
static void Main()
{
CN c1 = test();//一般情况下,函数是使用栈来存储变量i的,出了函数后i会被释放
CN c2 = test();//一般情况下,函数是使用栈来存储变量i的,出了函数后i会被释放
       //出了test()的作用域,再测试test()中的局部变量i是否仍然正常运作
Console.WriteLine(c1());
Console.WriteLine(c2());
Console.WriteLine(c1());
Console.WriteLine(c2());
}
//输出:
1
1
2
2

可以看到,效果完全一样, 可见,闭包的原理在C#与LUA中是一样的,理解这两种语言的闭包概念的两篇文章:

Lambda 表达式(C# 编程指南)

Lua中的闭包小结

闭包是造成内存泄露的罪魁祸首,在大型游戏项目中LUA造成的内存泄漏有一大部分是由于复杂的脚本逻辑间闭包的相互作用导致资源没有及时的释放掉造成的。C#项目也是如此。

C# LUA 闭包的更多相关文章

  1. LUA闭包概念演示

    闭包的一个重要场景,形成一个自治的环境, 让操作可以封闭运行, 即函数运行时有状态的,可以从闭包创建时候的环境独立开来. 例如下面的lua闭包, genFilter 其入参parmIn是 函数的内部变 ...

  2. 对 Lua闭包 知识点的学习的总结 ,在这里和大家分享一下,希望对大家有所帮助

    Lua闭包 --当一个函数内部嵌套另外一个函数定义时,内部的函数体可以访问外部的函数的局部变量,这种特征为词法定界.--闭包是由函数与其相关的引用环境组合而成的实体 闭包=函数+引用环境--不是在局部 ...

  3. 关于lua闭包导致引用无法释放内存泄露

    最近项目存在严重的内存泄漏问题,每次切level 会增加20M无法释放的内存,翻遍了项目用了多个工具,查询资料等 发现项目中两种存在内存泄露的情况 1.lua闭包的不当使用,对比包的引用要及时 释放. ...

  4. lua闭包与简易迭代器实现

    1.什么是闭包 闭包,又称闭合函数(closure).通常,如果将一个函数写在另一个函数内,那么这个在内部的函数就可以访问到外部函数中的局部变量,这个特征就是词法域,有些资料上也叫它词法定界.闭包指的 ...

  5. lua闭包浅析及项目应用

    lua函数与闭包: 原文地址:http://www.doc88.com/p-6681238341344.html 近日查阅关于lua的一些资料,找到了我能理解的关于lua函数与闭包的解析,我觉得这个程 ...

  6. lua闭包函数

    function createCountdownTimer(second) local ms = second * local function countDown() ms = ms - retur ...

  7. lua 闭包

    --匿名函数使用upvalue i保存他的计数, 闭包是一个函数加上它可以正确访问的upvalues function newCounter() return function() i = i + r ...

  8. lua闭包

    function MakeCounter() return function() t = t + return t end end local func = MakeCounter() , do pr ...

  9. lua闭包实现迭代器遍历数组

    --实现访问数组的迭代器 function visit(t) return function() i = i + return t[i] end end --要访问的数组 ,,,} itor = vi ...

随机推荐

  1. android 学习运用海马模拟器教程与android环境的搭建

    第三方海马玩模拟器 第一天的学习android采用的模拟器是海马,因此就分享给大家海马模拟器的相关步骤: 海马玩模拟器官网: http://droid4x.haimawan.com 下载相关平台的模拟 ...

  2. Objective-C之Protocol

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  3. linux下安装mysql手记

    安装mysql 下载mysql-standard-4.1.8-pc-linux-i686.tar.gz文件到目录/usr/local/下 # groupadd mysql   //添加mysql用户组 ...

  4. 安装concrete时提示“...database does not support InnoDB database tables..."如何解决

    安装很多系统时,经常有有提示: "...database does not support InnoDB database tables..." 解决办法: 找到MySQL的配置文 ...

  5. MySQL 存储过程实例 与 ibatis/mybatis/hibernate/jdbc 如何调用存储过程

    虽然MySQL的存储过程,一般情况下,是不会使用到的,但是在一些特殊场景中,还是有需求的.最近遇到一个sql server向mysql迁移的项目,有一些sql server的存储过程需要向mysql迁 ...

  6. 用js获取当前页面的url的相关信息方法

    当前页面对应的URL的一些属性: ( http://bbs.xxx.net/forum.php?mod=viewthread&tid=2709692&page=1&extra= ...

  7. asp.net的心得体会

    1,gridview有点强大 2,页面的冗余代码有点多,性能略差. 3,access数据库的使用. 4,C/S端的开发,接触winform的开发 我自认为asp.net开发就像在一个别人限制好的画布上 ...

  8. Linux运维工程师入门须掌握的10个技术点

    本人是linux运维工程师,对这方面有点心得,现在我说说要掌握哪方面的工具吧 说到工具,在行外可以说是技能,在行内我们一般称为工具,就是运维必须要掌握的工具. 我就大概列出这几方面,这样入门就基本没问 ...

  9. 03_汇编语言(n个数找最大值)

    程序要求: 先输入一个数n(0<n<=100),再输入n个无符号数K(0<=K<=65535),找出这n个数的最大值并输出 测试实例保证输入每个数之后,都会以回车结束 代码: ...

  10. [转]ASP.NET 2.0中GridView无限层复杂表头的实现

    本文转自:http://blog.csdn.net/net_lover/article/details/1306211 实现方法就是给单元格填充我们想要的格式代码. C# <%@ Page La ...