Oct 5, 2013

Closures em C#


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: