在下面的程序中,DummyMethod 总是打印 5。但是如果我们使用注释代码,我们会得到不同的值(即 1、2、3、4)。有人可以解释为什么会发生这种情况吗?
delegate int Methodx(object obj);
static int DummyMethod(int i)
{
Console.WriteLine("In DummyMethod method i = " + i);
return i + 10;
}
static void Main(string[] args)
{
List<Methodx> methods = new List<Methodx>();
for (int i = 0; i < 5; ++i)
{
methods.Add(delegate(object obj) { return DummyMethod(i); });
}
//methods.Add(delegate(object obj) { return DummyMethod(1); });
//methods.Add(delegate(object obj) { return DummyMethod(2); });
//methods.Add(delegate(object obj) { return DummyMethod(3); });
//methods.Add(delegate(object obj) { return DummyMethod(4); });
foreach (var method in methods)
{
int c = method(null);
Console.WriteLine("In main method c = " + c);
}
}
另外,如果使用以下代码,我会得到所需的结果。
for (int i = 0; i < 5; ++i)
{
int j = i;
methods.Add(delegate(object obj) { return DummyMethod(j); });
}
问题是你正在捕获相同的变量i
在每个委托中 - 在循环结束时其值仅为 5。
相反,您希望每个委托捕获不同的变量,这意味着在循环中声明一个新变量:
for (int i = 0; i < 5; ++i)
{
int localCopy = i;
methods.Add(delegate(object obj) { return DummyMethod(localCopy); });
}
这是一个非常常见的“陷阱” - 您可以阅读有关捕获变量和闭包的更多信息我的闭包文章 http://csharpindepth.com/Articles/Chapter5/Closures.aspx.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)