C# LUA 闭包

本文通过C#和LUA两种语言的示例,详细对比了闭包的实现方式及其潜在的内存泄露问题。文章展示了如何用C#的Lambda表达式实现与LUA相同的闭包效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C# LUA 闭包

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

//LUA------------------------------------------------
function
test()      local i = 0      return function () -- 匿名函数           i = i + 1           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) //输出 1 function: 00C9BA00 1 function: 00C9B780 2 function: 00C9BA00 2 function: 00C9B780
//C#---------------------------------------------------
1
delegate int CN(); 2 static CN test() 3 { 4 int i = 0; 5 CN cn = () => { return i = i + 1; }; 6 7 return cn; 8 } 9 static void Main() 10 { 11 CN c1 = test();//一般情况下,函数是使用栈来存储变量i的,出了函数后i会被释放 12 CN c2 = test();//一般情况下,函数是使用栈来存储变量i的,出了函数后i会被释放
       //出了test()的作用域,再测试test()中的局部变量i是否仍然正常运作
13 Console.WriteLine(c1()); 14 Console.WriteLine(c2()); 15 Console.WriteLine(c1()); 16 Console.WriteLine(c2()); 17 }
//输出:
1
1
2
2

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

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

Lua中的闭包小结

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    

posted on 2016-10-24 17:24 时空观察者9号 阅读(...) 评论(...) 编辑 收藏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值