Задать вопрос
BadCats
@BadCats

Вопрос по классу-делегату и принимаемыми им параметрами?

всем привет, только что начал изучать делегаты. имеется такой пример:
// Класс, метод которого будет сообщен с делегатом.
    static class MyClass
    {
        // Создаем статический метод, который планируем сообщить с делегатом.
        public static void Method()
        {
            Console.WriteLine("Строку вывел метод сообщенный с делегатом.");
        }
    }

    // На 21-й строке создаем класс-делегата с именем MyDelegate,
    // метод, который будет сообщен с экземпляром данного класса-делегата, 
    // не будет ничего принимать и не будет ничего возвращать.

    public delegate void MyDelegate();  // Создаем класс делегата. (1) 

    class Program
    {
        static void Main()
        {
            MyDelegate myDelegate = new MyDelegate(MyClass.Method); // Создаем экземпляр делегата. (2)

            myDelegate.Invoke(); // Вызываем метод сообщенный с делегатом. (3)

            myDelegate();        // Другой способ вызова метода сообщенного с делегатом. (3')

            // Delay.
            Console.ReadKey();
        }
    }

обратите внимание, на данную строку:
public delegate void MyDelegate();  // Создаем класс делегата. (1)

данный курс предоставляется в виде видео-уроков, автор говорит следующее:

"обратите внимание, что метод (конструктор по умолчанию в нашем классе-делегате), который будет сообщен с этим экземпляром данного класса-делегата - ничего не должен принимать , и также ничего не должен возвращать "

вот мой вопрос: то, что конструктор по умолчанию класса-делегата :ничего не должен принимать , и также ничего не должен возвращать " - это аксиома для всех делегатов при из создании, или это конкретный случай из-за того, что данный делегат, в данном случае сообщен с таким методом:
public static void Method()
        {
            Console.WriteLine("Строку вывел метод сообщенный с делегатом.");
        }

- который ничего не принимает в качестве параметров и является void т.е ничего не возвращает, и не повлиял ли данный метод на принципы построения делегата и параметры его конструктора?
Т.е в итоге это либо

  • общая аксиома
  • конкретный случай построения класса-делегата сообщенного с данным методом

вот в качестве ответа я хочу получить разъяснение и ответ, что из двух вариантов является верным.
  • Вопрос задан
  • 372 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 2
@atticus_finch
Отвечая на ваш вопрос - это конкретный случай построения класса-делегата сообщенного с данным методом.
Когда вы создаете класс-делегата (public delegate void MyDelegate();) вы указываете сигнатуру методов, которые потом можно сообщить с этим делегатом.
Как пример вот вам делегат с принимаемыми параметрами и возвращаемым значение.
public delegate int MyDelegate(int a, int b);
Теперь вы можете сообщить с этим делегатом методы с такой же сигнатурой. Например
public static int Sum(int a, int b)
        {
            return a+b;
        }

Вызов делегата
class Program
    {
        static void Main()
        {
            MyDelegate myDelegate = new MyDelegate(MyClass.Sum); 
            int result = myDelegate(5, 10);
        }
    }
Ответ написан
Комментировать
@dmitryKovalskiy
программист средней руки
Какой конструктор делегата? какой класс-делегат? вы о чем вообще? делегат - это тип, представляющий собой ссылку на метод, который удовлетворяет некоторой сигнатуре. В вашем случае сигнатура - ничего на вход, ничего на выход. Собсно доки .
MyDelegate myDelegate = new MyDelegate(MyClass.Method)

При такой записи вы должны внутрь "конструктора" передать метод, удовлетворяющий сигнатуре делегата.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы