[Этюд] Понимаете ли вы замыкания?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 09.12.07 10:59
Оценка: 68 (11)
Что выведет каждая из следующих программ на C#?

///////////////////////////////////
// Вариант 1.
///////////////////////////////////
using System;
using System.Collections.Generic;

delegate int F();

class Program
{

   static void Main()
   {
       List<F> fs = new List<F>();
       int[] xs = {1, 2, 3};

       foreach (int x in xs)
       {
           fs.Add(delegate { return x; });
       }

       foreach (F f in fs)
       {
           Console.WriteLine(f());
       }
   }
}


///////////////////////////////////
// Вариант 2.
///////////////////////////////////
using System;
using System.Collections.Generic;

delegate int F();

class Program
{

   static void Main()
   {
       List<F> fs = new List<F>();
       int[] xs = {1, 2, 3};

       foreach (int x in xs)
       {
           int y = x;
           fs.Add(delegate { return y; });
       }

       foreach (F f in fs)
       {
           Console.WriteLine(f());
       }
   }
}


///////////////////////////////////
// Вариант 3.
///////////////////////////////////
using System;
using System.Collections.Generic;

delegate int F();

class Program
{

   static void Main()
   {
       List<F> fs = new List<F>();
       int[] xs = {1, 2, 3};

       foreach (int x in xs)
       {
           fs.Add(delegate
                      {
                          int y = x;
                          return y;
                      });
       }

       foreach (F f in fs)
       {
           Console.WriteLine(f());
       }
   }
}


///////////////////////////////////
// Вариант 4.
///////////////////////////////////
using System;
using System.Collections.Generic;

delegate int F();

class Program
{
   static void Main()
   {
       List<F> fs = new List<F>();
       int[] xs = {1, 2, 3};

       for (int i = 0; i < 3; i++) // Превед, Numnul ;-)
       {
           fs.Add(delegate { return xs[i]; });
       }

       foreach (F f in fs)
       {
           Console.WriteLine(f());
       }
   }
}


Проверить свой ответ можно, скомпилировав и запустив их.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.