C# lambda表达式中对象的范围

C# lambda表达式中对象的范围,c#,delegates,lambda,C#,Delegates,Lambda,我是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 =

我是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();
        }
    }
}
delegate bool D1();
代表布尔D2(int i);
命名空间控制台
{
班级计划
{
D1;
D2;
公共void测试方法(int输入)
{
int j=0;
d1=()=>{j=10;返回j{return x==j;};
System.Console.WriteLine(“j={0}”,j);
bool res=d1();
System.Console.WriteLine(“res={0},j={1}”,res,j);
}
静态void Main(字符串[]参数)
{
程序p=新程序();
p、 试验方法(10);
系统控制台写入线(第d2(10)页);
System.Console.ReadKey();
}
}
}

我不明白的是调用
d2
prints
true
。当构建
d2
时,
j
的值为
0
。只有在稍后在
testMethod
中调用了
d1
之后,才对其进行更改。那么它是如何打印
True
?这里我遗漏了什么?

d1
d2
都指的是
j
的同一个实例。当您通过调用
d1
设置
j
时,您还改变了
d2
可以看到的变量的值

如果希望它们具有不同的
j
实例,则需要确定变量的范围:

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

{
  int j = 0;
  d2 = (x) => { return x == j; };
}
{
int j=0;
d1=()=>{j=10;返回j{return x==j;};
}

但是,如果要这样做,那么最好使用两个不同的变量,例如
j1
j2
。这将更具可读性。

创建委托时,将捕获其使用范围之外的任何变量。在这种情况下,分配给
d1
d2
的代理都捕获了
testMethod()中声明的变量
j
;它们不创建
j
的副本,而是捕获实际变量。从这个意义上说,在
d1
d2
的生命周期中,
j
在它们内部的行为就像它是一个全局变量一样(当然,在C#中没有全局变量)

如果希望这些方法分别获得
j
的实例,则需要为每个方法提供
j
的副本,而不仅仅是使用它。例如:

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

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

}
public void测试方法(int输入)
{
int j=0;
int k=j;
d1=()=>{j=10;返回j{return x==k;};
System.Console.WriteLine(“j={0}”,j);
bool res=d1();
System.Console.WriteLine(“res={0},j={1}”,res,j);
}

谢谢..我有什么方法可以控制这一点,以便
d1
d2
分别获得
j
的实例吗?