Olá.
Dado o seguinte programa em C# o que você espera que o mesmo imprima? (tente responder a pergunta sem compilar/executar o mesmo):
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
private static void Main(string[] args)
{
foreach (var func in GetFuncs1())
{
Console.WriteLine("[first] {0}", func());
}
foreach (var func in GetFuncs2())
{
Console.WriteLine("[second] {0}", func());
}
}
private static List<Func<int>> GetFuncs1()
{
var fs = new List<Func<int>>();
for (int i = 0; i < 3; i++)
{
fs.Add(() => i);
}
return fs;
}
private static List<Func<int>> GetFuncs2()
{
var fs = new List<Func<int>>();
foreach (var i in Enumerable.Range(0, 3))
{
fs.Add(() => i);
}
return fs;
}
}
Se você rodar o mesmo, o resultado obtido é compatível com sua expectativa? Não? Você entende o porque?
No próximo post vou discutir o comportamento deste programa e também como evitar algumas "armadilhas" relacionadas a Closures em C#.
(read this post in english)
No comments:
Post a Comment