C# 在for循环期间创建的操作委托不考虑;对于变量“;在委托方法中用作参数时的值
Noob,如果我没有正确使用术语,我道歉 下面的每个代码块都以字母列表C# 在for循环期间创建的操作委托不考虑;对于变量“;在委托方法中用作参数时的值,c#,loops,delegates,C#,Loops,Delegates,Noob,如果我没有正确使用术语,我道歉 下面的每个代码块都以字母列表{“a”,“c”}开始,并创建一个动作委托,以便稍后在“c”之前插入“b” 我发现,当我使用“for variable”时,I,作为List.Insert()的索引参数时,当我稍后调用动作委托时,传递的值不受尊重。但是如果我在一个新的int中捕获I,并在创建动作委托时传递该值,那么该值将得到尊重。此外,如果我在创建动作委托的迭代中检查变量I和index,它们都具有相同的值:1 我希望这两个代码块都会返回“abc”,但显然它们不
{“a”,“c”}
开始,并创建一个动作委托,以便稍后在“c”
之前插入“b”
我发现,当我使用“for variable”时,I
,作为List.Insert()
的索引参数时,当我稍后调用动作委托时,传递的值不受尊重。但是如果我在一个新的int
中捕获I
,并在创建动作委托时传递该值,那么该值将得到尊重。此外,如果我在创建动作委托的迭代中检查变量I
和index
,它们都具有相同的值:1
我希望这两个代码块都会返回“abc”,但显然它们不会
为什么这两组代码的行为不同?
此代码输出“acb”:
公共无效测试()
{
列表字母=新列表(){“a”,“c”};
列表操作=新建列表();
for(int i=0;i字母。插入(i,“b”));
}
}
对于(int i=actions.Count-1;i>-1;i--)
行动[一]();
foreach(字母中的var字母)
写(信);
}
此代码输出“abc”:
公共无效测试()
{
列表字母=新列表(){“a”,“c”};
列表操作=新建列表();
for(int i=0;i字母插入(索引,“b”));
}
}
对于(int i=actions.Count-1;i>-1;i--)
行动[一]();
foreach(字母中的var字母)
写(信);
}
它的名字叫closure@insane\u developer,谢谢!这些信息非常有用
public void Test()
{
List<string> letters = new List<string>() { "a", "c" };
List<Action> actions = new List<Action>();
for (int i = 0; i < letters.Count; i++)
{
string letter = letters[i];
if (letter == "c")
{
actions.Add(new Action(() => letters.Insert(i, "b")));
}
}
for (int i = actions.Count - 1; i > -1; i--)
actions[i]();
foreach (var letter in letters)
Debug.Write(letter);
}
public void Test()
{
List<string> letters = new List<string>() { "a", "c" };
List<Action> actions = new List<Action>();
for (int i = 0; i < letters.Count; i++)
{
string letter = letters[i];
if (letter == "c")
{
int index = i; // Using "index" instead of i when creating the action
actions.Add(new Action(() => letters.Insert(index, "b")));
}
}
for (int i = actions.Count - 1; i > -1; i--)
actions[i]();
foreach (var letter in letters)
Debug.Write(letter);
}