zoukankan      html  css  js  c++  java
  • 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#项目也是如此。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

        

  • 相关阅读:
    BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP
    BZOJ_1334_[Baltic2008]Elect_DP+语文题
    BZOJ_1858_[Scoi2010]序列操作_线段树
    BZOJ_1369_[Baltic2003]Gem_树形DP
    BZOJ_1705_[Usaco2007 Nov]Telephone Wire 架设电话线_DP
    BZOJ_2223_[Coci 2009]PATULJCI_主席树
    BZOJ_1800_[Ahoi2009]fly 飞行棋_乱搞
    BZOJ_1878_[SDOI2009]HH的项链_莫队
    Struts2自定义过滤器的小例子-入门篇
    JAVA程序员常用软件整理
  • 原文地址:https://www.cnblogs.com/timeObjserver/p/5993789.html
Copyright © 2011-2022 走看看