C#是否通过价值传递给Lambdas?

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

对不起,我的错误,它确实更新了原始计数.

mqp*_*mqp 7

count是一个int,而int是值类型,这意味着它们确实是按值传递的.您的第一个和第二个示例之间没有语义差异.

(也就是说,它看起来像它应该递增count,因为它应该捕获原始引用,直到闭包.澄清 - 虽然计数将通过值传递到SomeFunction,事情不会得到"通过"在表达式中使用它们时,将它们放入lambda表达式中 - 它们与外部变量的引用相同."


ben*_*wey 6

在这两种情况下,您都在创建所谓的闭包.从本质上讲,count被包装在一个类中,而该类正由lambda表达式使用.

Bill Wagner有一本名为More Effective C#的好书,他有一篇博文,更详细地介绍了闭包.


Jon*_*eet 6

变量计数由您的情况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.

有关闭包和变量捕获的更多信息,请参阅我的闭包文章.