C# 循环中的匿名方法

有这么一段C#代码:

Func<int> func = () => { return 0; };
for (int i = 0; i < 3; i++)
{
    func = () => { Console.WriteLine(i*i); return i; };
}
Console.WriteLine(func());
Console.ReadKey();

猜猜输出的是什么?

结果让人大跌眼镜:

9
3


下面看另外一个例子。

Func<int> func = () => { return 0; };
for (int i = 0; i < 3; i++)
{
    string s = i + "";
    func = () => { Console.WriteLine(s); return i; };
}
Console.WriteLine(func());
Console.ReadKey();

输出的结果是:

2
3


接下来再看两个例子。

Func<int>[] func = new Func<int>[] {
    ()=>{return 0;},
    ()=>{return 0;},
    ()=>{return 0;}
};
for (int i = 0; i < 3; i++)
{
    func[i] = () => { Console.WriteLine(i * i); return i; };
}
for (int i = 0; i < 3; i++)
{
    Console.WriteLine(func[i]());
}
Console.ReadKey();

输出的结果是:

9
3
9
3
9
3


下面一个例子会让你摸不着头脑了:

Func<int>[] func = new Func<int>[] {
    ()=>{return 0;},
    ()=>{return 0;},
    ()=>{return 0;}
};
for (int i = 0; i < 3; i++)
{
    string s = i + "";
    func[i] = () => { Console.WriteLine(s); return i; };
}
for (int i = 0; i < 3; i++)
{
    Console.WriteLine(func[i]());
}
Console.ReadKey();

此时输出竟是:

0
3
1
3
2
3

具体原因我尚不清楚,有待深入学习C#。

0 条评论

    发表评论

    电子邮件地址不会被公开。 必填项已用 * 标注