.NET 4.x Делегаты. Захват переменной - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет. Так и не смог понять пример из

Шилдт Г. - C# 4.0 полное руководство - 2011

Параграф в книге называется

Применение внешних переменных в анонимных методах

. Пример такой:
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace _9.Применение_захваченной_переменной
  7. {
  8. delegate int CountIt(int end);
  9. class VarCapture
  10. {
  11. public static CountIt Counter()
  12. {
  13. int sum = 0;
  14. CountIt ctObj = delegate(int end)
  15. {
  16. for (int i = 0; i <= end; i++)
  17. {
  18. Console.WriteLine(i);
  19. sum += i;
  20. }
  21. return sum;
  22. };
  23. return ctObj;
  24. }
  25. }
  26. class Program
  27. {
  28. static void Main(string[] args)
  29. {
  30. CountIt count = VarCapture.Counter();
  31. int result;
  32. result = count(3);
  33. Console.WriteLine("Сумма 3 равна " + result);
  34. Console.WriteLine();
  35. result = count(5);
  36. Console.WriteLine("Сумма 5 равна " + result);
  37. }
  38. }
  39. }
Не могу понять следующие строки:
Листинг программы
  1. CountIt count = VarCapture.Counter();
1. Почему мы вообще можем присвоить ссылку на метод

Counter

объекту

count

, если в объявлении делегата указано, что а) возвращаемое значение имеет тип int б) параметр делегата имеет тип int - а в методе

Сounter

вообще - возвращаемое значение имеет тип

CountIt

, а параметры вообще отсутствуют ? Короче - почему работает эта строка, которую написал выше? Как вообще можно объекту этого делегата
Листинг программы
  1. delegate int CountIt(int end);
присвоить вот этот метод?
Листинг программы
  1. public static CountIt Counter(){...}
У них же сигнатура вообще разная. Наследования здесь никакого нет, а значит ковариантность и контравариантность здесь вообще не работает. 2. Почему в этой же строке - после имени метода стоят скобки? (Без скобок не работает)
Листинг программы
  1. CountIt count = VarCapture.Counter();
До этого в книге объекты делегата инициализировались просто указанием имени метода БЕЗ скобок.

Решение задачи: «.NET 4.x Делегаты. Захват переменной»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace _9.Применение_захваченной_переменной
  8. {
  9.     delegate int CountIt(int end);
  10.  
  11.     class VarCapture
  12.     {
  13.         static CountIt Counter() // МЕТОД COUNTER ИЗНАЧАЛЬНО PRIVATE
  14.         {
  15.             int sum = 0;
  16.  
  17.             CountIt ctObj = delegate(int end)
  18.             {
  19.                 for (int i = 0; i <= end; i++)
  20.                 {
  21.                     Console.WriteLine(i);
  22.                     sum += i;
  23.                 }
  24.                 return sum;
  25.             };
  26.             return ctObj;
  27.         }
  28.     }
  29.     class Program
  30.     {
  31.         static void Main(string[] args)
  32.         {
  33.             CountIt count = Counter(); /*СТАТИЧЕСКИЙ МЕТОД ВЫЗЫВАЕТСЯ БЕЗ УКАЗАНИЯ КЛАССА
  34.                      И ТАКИХ ПРИМЕРОВ В КНИГЕ (ИМЕННО В ЭТОЙ ГЛАВЕ ПРО ДЕЛЕГАТЫ) ПОЛНО*/
  35.             int result;
  36.  
  37.             result = count(3);
  38.             Console.WriteLine("Сумма 3 равна " + result);
  39.             Console.WriteLine();
  40.  
  41.             result = count(5);
  42.             Console.WriteLine("Сумма 5 равна " + result);
  43.         }
  44.     }
  45. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут