gpt4 book ai didi

c# - 如何使用包含运行时值的委托(delegate)来初始化事件?

转载 作者:太空宇宙 更新时间:2023-11-03 20:53:00 25 4
gpt4 key购买 nike

我在尝试用一组委托(delegate)操作分配一组事件时遇到了这个问题。如果我使用 AssignEventsManually() 函数,事件会正确地触发它们分配的委托(delegate)及其包含的信息(不同的数字)。当我使用循环进行这些分配时,所有按钮都打印相同的值“B2”。

似乎委托(delegate)本身存储在堆中,但迭代数i在堆栈中并且每个委托(delegate)引用相同的项。如何实现为每个委托(delegate)分配其自己的迭代器实例?

using System.Windows.Forms;

namespace DelegatesTest
{
public partial class Form1 : Form
{
Button[] bar;

public Form1()
{
InitializeComponent();

bar = new Button[] { button1, button2, button3 };

for (int i=0; i<3; i++)
{
bar[i].Click += delegate
{
richTextBox1.Text = $"B{i}";
};
}

//AssignEventsManually();
}

void AssignEventsManually()
{
button1.Click += delegate
{
richTextBox1.Text = $"b{1}";
};
button2.Click += delegate
{
richTextBox1.Text = $"b{2}";
};
button3.Click += delegate
{
richTextBox1.Text = $"b{3}";
};
}

}
}

最佳答案

It seems that the delegate itself is stored in the heap but the iterating number "i" is in the stack and each delegate references the same item. How can I achieve assigning each delegate with its own instance of the iterator?

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;
};
}

这是可行的,因为额外局部的范围在循环内部,所以:每个循环迭代不同的捕获上下文。

关于c# - 如何使用包含运行时值的委托(delegate)来初始化事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53338194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com