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

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

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

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

Шилдт Г. - 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();
1. Почему мы вообще можем присвоить ссылку на метод

Counter

объекту

count

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

Сounter

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

CountIt

, а параметры вообще отсутствуют ? Короче - почему работает эта строка, которую написал выше? Как вообще можно объекту этого делегата
delegate int CountIt(int end);
присвоить вот этот метод?
public static CountIt Counter(){...}
У них же сигнатура вообще разная. Наследования здесь никакого нет, а значит ковариантность и контравариантность здесь вообще не работает. 2. Почему в этой же строке - после имени метода стоят скобки? (Без скобок не работает)
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);
        }
    }
}

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


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

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

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