Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2016, 13:13   #1
BadCats
Пользователь
 
Аватар для BadCats
 
Регистрация: 31.01.2016
Сообщений: 67
Радость делегаты и их экземпляры

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

для того, чтобы создать делегат, мы сперва создаем класс-делегат(да,да я знаю, что это не совсем корректное название )
Код:
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)
и просто в качестве параметра конструктора передать другой метод с такой же сигнатурой(кроме имени конечно)

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

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

Я правильно все понял?

Последний раз редактировалось BadCats; 15.04.2016 в 13:16. Причина: смена заголовка
BadCats вне форума Ответить с цитированием
Старый 15.04.2016, 13:55   #2
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Сообщений: 181
По умолчанию

Не совсем так. Для начала, если у тебя совпадает сигнатура нескольких методов, то ты можешь одному экземпляру делегата присваивать их. Т.е.:
Код:
public delegate void MyDelegate();  // Создаем класс делегата. (1)
public static void Method()
        {
            Console.WriteLine("Строку вывел метод сообщенный с делегатом.");
        }
public static void MyMethod()
        {
            Console.WriteLine("Строку вывел метод сообщенный с делегатом.");
        }
MyDelegate myDelegate = new MyDelegate(MyClass.Method); // Создаем экземпляр делегата. (2)
myDelegate(); // аналогично MyDelegate.Invoke() - запуск метода, который хранится в делегате
myDelegate=MyClass.MyMethod; //присваиваешь уже созданному делегату второй метод, но без (), только название
myDelegate(); //и используя один и тот же экземпляр делегата вызываешь уже другой метод
Дальше когда почитаешь, что ты можешь сделать групповой делегат (так сказать массив методов, но при этом не массив), и используя myDelegate() сможешь вызвать все методы, которые ты добавил в групповой делегат.
Второй момент. Как правило очень редко тебе придется "описывать" свой делегат. На эти случае в шарпах уже придусмотрены делегаты Action<> и Func<>, но ты до них видимо еще не дошел.
max_prorok вне форума Ответить с цитированием
Старый 15.04.2016, 14:14   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

http://programmersforum.ru/showthread.php?t=291965
вы тут так и не прочли видимо?

естественно для присвоения делегату метода сигнатура должна совпадать, иначе не вызовете же.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Универсальный делегат inmyacid C# (си шарп) 3 12.02.2014 19:55
Преобразовать строку с функцией в делегат FiloXSee C# (си шарп) 1 08.10.2012 13:35
Делегат СompareDelegate<T> Николая Ленин C# (си шарп) 1 13.04.2012 15:32
ПАРАМЕТРЫ-КОНСТАНТЫ, НЕТИПИЗИРОВАННЫЕ ПАРАМЕТРЫ ПОДПРОГРАММ, МАССИВЫ И СТРОКИ ОТКРЫТОГО ТИПА Юрий62 Помощь студентам 1 04.12.2011 14:09
Делегат, интерфейс, событие. pa6kevi4 Общие вопросы .NET 1 25.05.2010 19:26