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:访问块中的局部变量的主要内容,如果未能解决你的问题,请参考以下文章

JAVA_01

Java中的变量

Java 变量类型

如何在 C# 循环中捕获局部变量?

Java变量类型

Java学习笔记23---内部类之局部内部类只能访问final的局部变量