C#中的Lambdas捕获外部变量 - 请从"C#in nutshell 5.0"一书中解释示例

Yul*_*mok 1 c# lambda

有什么区别

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

static Func<int> Natural()
{
  return() => { int seed = 0; return seed++; };
}
Run Code Online (Sandbox Code Playgroud)

为什么

static void Main()
{
  Func<int> natural = Natural();
  Console.WriteLine (natural());       
  Console.WriteLine (natural());         
}
Run Code Online (Sandbox Code Playgroud)

第一个Natural()显示0 1,第二个显示0 0?谢谢!

Jon*_*eet 11

不同之处在于,在第一个版本中,您声明了一个变量,然后在lambda表达式中捕获该变量.变量本身在代理的多次调用中"幸存".

在第二个例子中,你声明一个变量里面的lambda表达式,所以每次执行委托时,变量有效地重新开始.

换句话说,它的区别在于:

class NaturalImpl
{
    public int seed;

    public int Method()
    {
        return seed++;
    }
}

Func<int> natural = new NaturalImpl().Method;
Run Code Online (Sandbox Code Playgroud)

和:

class NaturalImpl
{
    public int Method()
    {
        int seed = 0;
        return seed++;
    }
}

Func<int> natural = new NaturalImpl().Method;
Run Code Online (Sandbox Code Playgroud)

请注意第一个版本中的实例变量与第二个版本中的局部变量之间的差异.

(这不完全是第二种形式的实现方式;它将是封闭类中的静态方法,因为它是无状态的,但是......)