.NET 4.x Делегаты. Захват переменной - C#
Формулировка задачи:
Всем привет.
Так и не смог понять пример изНе могу понять следующие строки:
1. Почему мы вообще можем присвоить ссылку на метод присвоить вот этот метод?
У них же сигнатура вообще разная. Наследования здесь никакого нет, а значит ковариантность и контравариантность здесь вообще не работает.
2. Почему в этой же строке - после имени метода стоят скобки? (Без скобок не работает)
До этого в книге объекты делегата инициализировались просто указанием имени метода БЕЗ скобок.
Шилдт Г. - C# 4.0 полное руководство - 2011
Параграф в книге называетсяПрименение внешних переменных в анонимных методах
. Пример такой:using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _9.Применение_захваченной_переменной { delegate int CountIt(int end); class VarCapture { public static CountIt Counter() { int sum = 0; CountIt ctObj = delegate(int end) { for (int i = 0; i <= end; i++) { Console.WriteLine(i); sum += i; } return sum; }; return ctObj; } } class Program { static void Main(string[] args) { CountIt count = VarCapture.Counter(); int result; result = count(3); Console.WriteLine("Сумма 3 равна " + result); Console.WriteLine(); result = count(5); Console.WriteLine("Сумма 5 равна " + result); } } }
CountIt count = VarCapture.Counter();
Counter
объектуcount
, если в объявлении делегата указано, что а) возвращаемое значение имеет тип int б) параметр делегата имеет тип int - а в методеСounter
вообще - возвращаемое значение имеет типCountIt
, а параметры вообще отсутствуют ? Короче - почему работает эта строка, которую написал выше? Как вообще можно объекту этого делегатаdelegate int CountIt(int end);
public static CountIt Counter(){...}
CountIt count = VarCapture.Counter();
Решение задачи: «.NET 4.x Делегаты. Захват переменной»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _9.Применение_захваченной_переменной { delegate int CountIt(int end); class VarCapture { static CountIt Counter() // МЕТОД COUNTER ИЗНАЧАЛЬНО PRIVATE { int sum = 0; CountIt ctObj = delegate(int end) { for (int i = 0; i <= end; i++) { Console.WriteLine(i); sum += i; } return sum; }; return ctObj; } } class Program { static void Main(string[] args) { CountIt count = Counter(); /*СТАТИЧЕСКИЙ МЕТОД ВЫЗЫВАЕТСЯ БЕЗ УКАЗАНИЯ КЛАССА И ТАКИХ ПРИМЕРОВ В КНИГЕ (ИМЕННО В ЭТОЙ ГЛАВЕ ПРО ДЕЛЕГАТЫ) ПОЛНО*/ int result; result = count(3); Console.WriteLine("Сумма 3 равна " + result); Console.WriteLine(); result = count(5); Console.WriteLine("Сумма 5 равна " + result); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д