.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);
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д