static void Main(string[] args)
{
var list = new List<A>();
for (int i = 0; i < 5; i++)
{
var str = i.ToString();
var a = new A();
a.Handler += (s, e) =>
{
Console.WriteLine("数字:{0}\t字符串:{1}", i, str);
// 数字:5 字符串:0
// 数字:5 字符串:1
// 数字:5 字符串:2
// 数字:5 字符串:3
// 数字:5 字符串:4
};
list.Add(a);
}
foreach (var a in list) { a.Do(); }
Console.ReadKey();
}
class A
{
public event EventHandler Handler;
public void Do()
{
if (Handler != null)
Handler(this, new EventArgs());
}
}
2 个解决方案
#1
第一轮循环的时候 你以为i是0?好吧 他确实是0
第二轮的时候 他已经变成1了 知道 i++ 等于 5 的时候不满足条件 跳出了循环
i的最终值是 5 所以说你的数字一直是5 而str每一轮都是一个新的变量
你吧 你的list.Add(a) 直接换成 a.Do() 说不定就会有不同效果了 。。。
以上言论纯属个人YY。。。。。。
第二轮的时候 他已经变成1了 知道 i++ 等于 5 的时候不满足条件 跳出了循环
i的最终值是 5 所以说你的数字一直是5 而str每一轮都是一个新的变量
你吧 你的list.Add(a) 直接换成 a.Do() 说不定就会有不同效果了 。。。
以上言论纯属个人YY。。。。。。
#2
你得了解一下闭包的概念
#1
第一轮循环的时候 你以为i是0?好吧 他确实是0
第二轮的时候 他已经变成1了 知道 i++ 等于 5 的时候不满足条件 跳出了循环
i的最终值是 5 所以说你的数字一直是5 而str每一轮都是一个新的变量
你吧 你的list.Add(a) 直接换成 a.Do() 说不定就会有不同效果了 。。。
以上言论纯属个人YY。。。。。。
第二轮的时候 他已经变成1了 知道 i++ 等于 5 的时候不满足条件 跳出了循环
i的最终值是 5 所以说你的数字一直是5 而str每一轮都是一个新的变量
你吧 你的list.Add(a) 直接换成 a.Do() 说不定就会有不同效果了 。。。
以上言论纯属个人YY。。。。。。
#2
你得了解一下闭包的概念