Кажется, что сам делегат хранится в куче, но номер итерации "i" находится в стеке, и каждый делегат ссылается на один и тот же элемент. Как я могу добиться назначения каждого делегата с его собственным экземпляром итератора?
i
здесь «захваченная» переменная, которая находится в куче в классе контекста. Контекстный класс имеет такую же область действия, что и i
, то есть: на время цикла
Чтобы исправить это: создайте снимок копии i
внутри цикла.
for (int i=0; i<3; i++)
{
int cpy = i;
bar[i].Click += delegate
{
richTextBox1.Text = $"B{cpy}";
};
}
Или, возможно, более эффективно:
for (int i=0; i<3; i++)
{
string txt = $"B{i}";
bar[i].Click += delegate
{
richTextBox1.Text = txt;
};
}
Это работает, потому что область действия дополнительного локального элемента внутри цикла, поэтому: разный контекст захвата для итерации цикла.