lambda表达式中对象的范围

Nav*_*een 2 c# lambda delegates

我是C#的新手,并试图理解lambda表达式和委托.这是我正在运行的代码:

delegate bool D1();
delegate bool D2(int i);

namespace Console
{
    class Program
    {
        D1 d1;
        D2 d2;

        public void testMethod(int input)
        {
            int j = 0;
            d1 = () => { j = 10; return j < input; };
            d2 = (x) => { return x == j; };
            System.Console.WriteLine("j = {0}", j);

            bool res = d1();
            System.Console.WriteLine("res={0}, j ={1}", res, j);

        }

        static void Main(string[] args)
        {
            Program p = new Program();
            p.testMethod(10);
            System.Console.WriteLine(p.d2(10));
            System.Console.ReadKey();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我不明白的是d2印刷品的调用true.什么d2 时候构建的价值j0.它只是在d1稍后调用之后才被更改testMethod.那怎么印刷True?我在这里想念的是什么?

Sea*_*ean 6

d1并且d2都引用了相同的实例j.当你j通过调用设置时,d1你也在改变d2可以看到的变量的值.

如果你想要它们确实有不同的实例,j你需要对变量进行范围调整:

{
  int j = 0;
  d1 = () => { j = 10; return j < input; };
}

{
  int j = 0;
  d2 = (x) => { return x == j; };
}
Run Code Online (Sandbox Code Playgroud)

但是,如果你要做到这一点,那么你可能也有两个不同的变量,说j1j2来代替.这将更具可读性.