BadCats
@BadCats

Делегаты и их экземпляры?

всем привет, только начал учить делегаты. и пока понял следующее:

для того, чтобы создать делегат, мы сперва создаем класс-делегат(да,да я знаю, что это не совсем корректное название )
public delegate void MyDelegate();  // Создаем класс делегата. (1)

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

затем, мы создаем экземпляр делегата, конструктор которого принимает нужный нам для сообщения метод:
MyDelegate myDelegate = new MyDelegate(MyClass.Method); // Создаем экземпляр делегата. (2)

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

- совпадает с сигнатурой класса-делегата, то нам остается создать только еще один экземпляр делегата
MyDelegate myDelegate = new MyDelegate(MyClass.MyMethod); // Создаем экземпляр делегата. (2)

и просто в качестве параметра конструктора передать другой метод с такой же сигнатурой(кроме имени конечно)

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

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

Я правильно все понял?
  • Вопрос задан
  • 428 просмотров
Решения вопроса 2
@dmitryKovalskiy
программист средней руки
Да, примерно вы все правильно поняли. Для методов с идентичной сигнатурой хватит одного делегата, для метода с другой сигнатурой - требуется другой делегат.
Ответ написан
Комментировать
@Hydro
C#/.NET Developer
Да, все так.
И многие ситуации уже покрываются встроенными делегатами Func и Action и их перегрузками
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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