添加方法在“for”循环中委托更改迭代 - C#问题?

时间:2017-11-20 18:03:43

标签: c# .net loops iterator delegates

我遇到了C#代码的一些问题。添加方法以“for”循环委托“i”加1,所以“for(int i = 0,i< x; i ++)”必须改为“for(int i = -1,i< x-1; i ++)“正常工作。那是为什么?

以下代码抛出IndexOutOfRangeException

string[] names = new string[] { "John", "Madeline", "Jack", "Gabby" };
Action showNameDelegate = null;
for (int i = 0; i < names.Length; i++)
{
    showNameDelegate += () => global::System.Console.WriteLine(names[i]);
}
foreach (Action showName in showNameDelegate.GetInvocationList())
{
    showName();
}

正确的代码是(查看迭代器“i”,它从-1开始,但“names [-1]”不存在):

string[] names = new string[] { "John", "Madeline", "Jack", "Gabby" };
Action showNameDelegate = null;
for (int i = -1; i < names.Length - 1; i++)
{
    showNameDelegate += () => global::System.Console.WriteLine(names[i]);
}
foreach (Action showName in showNameDelegate.GetInvocationList())
{
    showName();
}

这个答案是正确的(由Ed Plunkett撰写): 每个委托引用变量i。它们都引用变量,因此当它们执行时,它们将获得它当时拥有的任何值。在for循环完成后执行委托。那时,我等于名字.Length。在循环体中创建i的本地副本 - 或者使用foreach循环,它会自动修复此问题。

1 个答案:

答案 0 :(得分:0)

您应该像这样更改代码;

for (int i = -1; i < names.Length - 1; i++)
{
    string name = names[i];
    showNameDelegate += () => global::System.Console.WriteLine(name);
}

或者您可以尝试使用foreach。