我知道很多关于 C# 闭包的问题已经提出、回答或讨论过。但是请在我的小实验上花点时间......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
using (var timer = new Timer(500))
{
timer.AutoReset = false;
GetFunc2(timer, 0);
// GetFunc3(timer, 0);
timer.Start();
Console.ReadLine();
}
}
static void GetFunc2(Timer timer, int i)
{
for (; i < 5; ++i)
{
timer.Elapsed += (obj, e) =>
{
Console.WriteLine(i);
};
}
}
static void GetFunc3(Timer timer, int i)
{
timer.Elapsed += (obj, e) =>
{
Console.WriteLine(i++);
};
timer.Elapsed += (obj, e) =>
{
Console.WriteLine(i++);
};
timer.Elapsed += (obj, e) =>
{
Console.WriteLine(i++);
};
timer.Elapsed += (obj, e) =>
{
Console.WriteLine(i++);
};
timer.Elapsed += (obj, e) =>
{
Console.WriteLine(i++);
};
}
}
}
通过单独调用GetFunc2
和GetFunc3
,Main
我们可以看到输出是不同的,虽然GetFun3
看起来只是 . 的简单扩展GetFunc2
。有谁知道为什么?我认为 ildasm 可以揭示不同的生成代码,但我确实想知道为什么。在 VS2012 Pro、.net 4.5 上测试。