我是 C# 的新手,正在尝试理解 lambda 表达式和委托(delegate)。这是我正在运行的代码:
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();
}
}
}
我不明白的是 d2
的调用打印 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; };
}
但是,如果您要这样做,那么您最好有两个不同的变量,例如 j1
和 j2
。这将更具可读性。
关于c# - lambda 表达式中的对象范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8534118/