C# Func:访问块中的局部变量
Posted
技术标签:
【中文标题】C# Func:访问块中的局部变量【英文标题】:C# Func: access local variables in a block [duplicate] 【发布时间】:2014-09-23 12:33:30 【问题描述】:假设我在 C# 中有这段代码:
static void Main(string[] args)
List<Func<int>> fs = new List<Func<int>>();
for (int i = 0; i < 5; i++)
fs.Add(() => return i; );
for (int i = 0; i < 5; i++)
Console.WriteLine(fs[i]());
Console.ReadLine();
当我运行它时,我希望它会打印出来
0
1
2
3
4
但它会打印出来
5
5
5
5
5
相反。我的理解是Func中的代码只保留了i
的地址,而不是获取i
的值,应该避免这种做法。
所以我的问题是,有没有办法捕获局部变量并按值将它们传递给Func
?
【问题讨论】:
我还没有找到它,但我知道它有重复。另见Closing over the loop variable considered harmful 【参考方案1】:您可以使用 for 循环中的范围来捕获 i 的值的副本:
static void Main(string[] args)
List<Func<int>> fs = new List<Func<int>>();
for (int i = 0; i < 5; i++)
var copyOfi = i;
fs.Add(() => return copyOfi; );
for (int i = 0; i < 5; i++)
Console.WriteLine(fs[i]());
Console.ReadLine();
【讨论】:
【参考方案2】:只需将循环变量存储在循环内的局部变量中,然后在 lambda 表达式中使用即可。
【讨论】:
以上是关于C# Func:访问块中的局部变量的主要内容,如果未能解决你的问题,请参考以下文章