C# lambda表达式中对象的范围
我是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 =
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
printstrue
。当构建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
的实例吗?