c#函数:访问块中的局部变量

本文关键字:局部变量 访问 函数 | 更新日期: 2023-09-27 18:16:00

假设我在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 ?

c#函数:访问块中的局部变量

您可以使用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();
}

只需将循环变量存储在循环内部的局部变量中,并在lambda表达式中使用它。