Ant*_*y D 5 .net c# lambda delegates
我有一些代码,
int count = 0;
list.ForEach(i => i.SomeFunction(count++));
Run Code Online (Sandbox Code Playgroud)
这似乎不会增加计数.计数是否按此值传递?如果我在lambda中使用{}有什么区别吗?
int count = 0;
list.ForEach(i =>
{
i.SomeFunction(count++);
});
Run Code Online (Sandbox Code Playgroud)
更新1
对不起,我的错误,它确实更新了原始计数.
count是一个int,而int是值类型,这意味着它们确实是按值传递的.您的第一个和第二个示例之间没有语义差异.
(也就是说,它看起来像它应该递增count,因为它应该捕获原始引用,直到闭包.澄清 - 虽然计数将通过值传递到SomeFunction,事情不会得到"通过"在表达式中使用它们时,将它们放入lambda表达式中 - 它们与外部变量的引用相同."
在这两种情况下,您都在创建所谓的闭包.从本质上讲,count被包装在一个类中,而该类正由lambda表达式使用.
Bill Wagner有一本名为More Effective C#的好书,他有一篇博文,更详细地介绍了闭包.
该变量计数由您的情况lambda表达式捕获.count调用者可以看到任何更改.所以,例如:
int count = 0;
list.ForEach(i => i.SomeFunction(count++));
Console.WriteLine(count);
Run Code Online (Sandbox Code Playgroud)
将显示列表的大小,因为在每次迭代时您都在递增count.
但是,调用SomeFunction将值count++(的值是count增量前的值)的值传递给SomeFunction.换句话说,SomeFunction不能改变价值count.
有关闭包和变量捕获的更多信息,请参阅我的闭包文章.
| 归档时间: |
|
| 查看次数: |
1445 次 |
| 最近记录: |