匿名委托变量引用

str*_*onn 1 c# lambda

在委托声明中引用i是否有效?

targets[i].PingReply = e.Reply;
Run Code Online (Sandbox Code Playgroud)

它是否会引用相同的数组元素

pingSender.SendAsync( targets[i].IPAddress, targets[i].Timeout);
Run Code Online (Sandbox Code Playgroud)

当代表开火时,我的价值是不同的东西?我问,因为我在PingCompleted中得到一个超出i = 3的索引,我不知道为什么.

public void Ping(PingTest[] targets)
{
    var finished = new CountdownEvent(targets.Count());
    for (int i = 0; i < targets.Count(); i++)
    {
        finished.AddCount();
        var pingSender = new Ping();
        pingSender.PingCompleted += (sender, e) =>
                                        {
                                            targets[i].PingReply = e.Reply;
                                            finished.Signal();
                                        };
        pingSender.SendAsync(targets[i].IPAddress, targets[i].Timeout);
    }
    finished.Signal();
    finished.Wait();
}
Run Code Online (Sandbox Code Playgroud)

这是电话......

var pingTests = new PingTest[]
                    {
                        new PingTest("Router", new IPAddress(new byte[] {192, 168, 1, 8}), 2),
                        new PingTest("Exchange", new IPAddress(new byte[] {192, 168, 1, 78}), 3),
                        new PingTest("SQL", new IPAddress(new byte[] {192, 168, 1, 99}), 3)
                    };
netwrkService.Ping(pingTests);
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 5

你期望这个程序片段做什么?

int i = 0;
Func<int> f = ()=>i;
i = 3;
Console.WriteLine(f());
Run Code Online (Sandbox Code Playgroud)

试试吧.它做了你认为应该做的事吗?


匿名函数关闭变量,而不是变量过去的值.当您调用lambda时,循环变量不再具有创建委托时所执行的值.

有关详细信息,请参见http://ericlippert.com/2009/11/12/closing-over-the-loop-variable-considered-harmful-part-one/.