gpt4 book ai didi

c# - lambda 表达式如何共享局部变量?

转载 作者:行者123 更新时间:2023-11-30 13:57:47 24 4
gpt4 key购买 nike

我正在阅读有关 lambda 表达式的内容,并且我看过这个示例,

示例 1:

static Func<int> Natural()
{
int seed = 0;
return () => seed++; // Returns a closure
}

static void Main()
{
Func<int> natural = Natural();
Console.WriteLine (natural()); // output : 0
Console.WriteLine (natural()); // output : 1
}

示例 2:

static Func<int> Natural()
{
return() => { int seed = 0; return seed++; };
}

static void Main()
{
Func<int> natural = Natural();
Console.WriteLine (natural()); // output : 0
Console.WriteLine (natural()); // output : 0
}

我无法理解为什么第一个示例输出是 0 和 1。

最佳答案

因为第二个示例中的初始化代码 (int seed = 0) 在每次调用时都会运行。

在第一个示例中,seed 是一个存在于方法之外的捕获变量,因为只有一个实例,它的值在调用之间保留。

更新:为回应 David Amo 的评论,给出了解释。

选项 1)

static Func<int> Natural()
{
int seed = 0;
return () => seed++; // Returns a closure
}

选项 2)

static Func<int> Natural()
{
return() => { int seed = 0; return seed++; };
}

选项 3)

static Func<int> Natural()
{
int seed = 0;
return () => { seed = 0; return seed++;}; // Returns a closure
}

选项 3 返回与选项 2 相同的值,但在内部与选项 1 相同。seed 是在 Natural 中定义的变量,但由于它被委托(delegate)捕获它在方法退出后继续存在。

您可以用来查看发生了什么的另一个测试是

static Func<int> Natural()
{
int seed = 1;
Func<int> returnValue = () => { return seed++; };
seed = 2;
return returnValue;
}

关于c# - lambda 表达式如何共享局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19634566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com