我正试图将一个整数值传递到ElapsedEventHandler中,这样我就可以根据传入的整数进行逻辑运算。但是,当事件被引发时,传入的值不是我将其初始化为的值。我可能不完全理解委托是如何工作的。
class Example
{
Dictionary<int, Timer> timer;
public Example()
{
timer = new Dictionary<int, timer>();
for(int i = 0; i < 12; ++i)
{
timer.Add(i, new Timer(5000));
timer[i].Elapsed += delegate { TimerTickCustom(i); };
}
}
public void Process() // called each cycle
{
for(int i = 0; i < 12; ++i)
{
timer[i].Start();
}
}
private void TimerTickCustom(int i)
{
// The value of i coming in does not match the dictionary key.
}
}
它取决于本地值i
的位置,委托将其视为其范围的"特定"值。由于i
是在循环外定义的,因此委托不会定义它自己的该变量的"副本",因为所有委托都期望相同的i
。
您需要做的是将其分配给一个与委托本身"处于同一级别"的变量。
不确定我是否使用了正确的语言来解释它。但这应该有效:
class Example
{
Dictionary<int, Timer> timer;
public Example()
{
timer = new Dictionary<int, Timer>();
for(int i = 0; i < 12; ++i)
{
int iInScopeOfDelegate = i;
timer.Add(i, new Timer(5000));
timer[i].Elapsed += delegate { TimerTickCustom(iLocalToDelegate ); };
}
}
public void Process() // called each cycle
{
for(int i = 0; i < 12; ++i)
{
timer[i].Start();
}
}
private void TimerTickCustom(int i)
{
// The value of i coming in does not match the dictionary key.
}
}
如果你知道要在搜索引擎中输入哪些单词,就会有一些有趣的讨论(当然,在有人告诉你之前,你无法真正知道)。