C# LUA 闭包
C# LUA 閉包
許多語言中有閉包的概念,C#的閉包以lambda表達式表現,可以實現與LUA完全一樣的效果。
//LUA------------------------------------------------function test()local i = 0return function () -- 匿名函數i = i + 1return iend endc1 = 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號 閱讀(...) 評論(...) 編輯 收藏
總結
- 上一篇: string与stringBuilder
- 下一篇: C#中lock死锁实例教程