Очень хорошее объяснение. Везде пишут технические детали, но никто не пытается поговорить о сути. Сейчас у меня все прояснилось. Спасибо! Делаю репост!
Видно что очень много сил вложено в видеоурок. Ваши объяснения очень отличаются от всего остального, что можно найти на просторах ютуба именно тем, что Вы в первую очередь стараетесь донести суть, а не сухую теорию. Большой спасибо за Ваши ролики!
Благодарю за тёплый комментарий 💙 Очень рад, что ролик оказался полезным. Главная цель канала codaza - доступное изложение непростых концепций понятным языком.
Дико извиняюсь но тема не вся раскрыта. Не услышал главное отличие event-a от delegate-a. А оно принципиальное! Это я пишу для Ваших подпищиков. Делегат это поля класса, как было правильно замечено, как любое плен типа int или string. A event это всегда свойство! С двумя не явными setter-ом и getter-ом, а иногда и явными и приватным полем типа delegate. Вот поэтому подписаться на событие и отписаться можно и из вне класса, а то вызвать только изнутри, и это правильно! И только по этому, именно как property он (event) может быть объявлен в интерфейсе. Другими словами event это ничто другое как синтаксический сахар, за который мы и любим c#.
Классно, все элементарно и просто. Спасибо автору, достаточно было задуматься почему столь похожие на первый взгляд фичи называются совершенно по разному и стало понятнее. Цитаты огонь, кусочек мудрости в придачу к хорошим знаниям плюс дополнительный яркий образ для запоминания темы.
объясните пожалуйста, что значит кода из вне? это метод, который находиться в другом классе или метод, который находиться вообще в другом файле с кодом? (9:40)
Добрый день! Наконец-то, среди сотни сайтов нашел канал, где смог понять что такое делегат, ну и события автоматом. Спасибо! Большая просьба: не могли бы Вы вот также профессионально просветить наконец, так что же такое многопоточность и все, что вокруг нее вертится, а также работа с БД. Заранее благодарен!
Такие, как вы, автор, нужны людям. И ролики такие нужны. Хорошо, плавно, гладко, без всякого лишнего мычания, в меру динамтчно, в меру нерасторопно, но по делу. Поклон вам. Спасибо.
Мне очень жаль, что видео не помогло Вам. Безусловно, для его просмотра необходимо обладать некоторыми знаниями о программирования и C# в частности. Ваш текущей уровень знаний мне неизвестен, поэтому сложно предположить, что именно вызывало у Вас проблему в понимании. Попробуйте вернуться к видео позже. Уверен, Вы всё же получите от него пользу в будущем 🙂
Это лучшее объяснение делегатов и ивентов, которое я только видел! Сразу видно, автор хочет помочь всем непонимающим, спасибо за твой труд! Также хочется выделить подачу контента - все складно, никакой воды и качественные анимации, в общем все на высшем уровне.
13:00 спасибо за отличный материал и объяснение. Только нужно добавить, что самым главным отличием события от делегата является невозможно переписать список вызываемых методов вне класса. Если делегату можно задать вызываемый метод через = (и затереть таким образом все что там до этого находилось), то с событием такое "непроходже" - только через += (с сохранением списка вызовов и добавлением нового). Можно было отлично развить пример с библиотекой из прошлого урока, там именно что нужен не делегат а событие. Жаль про это не сказал. Жаль что забросил канал - у тебя отлично получалось
О самом главном не сказал... Event имеет урезанный интерфейс. А точнее только += и -= что предотвращает прямое влияние на делегат. На пример в случае публичного делегата ему можно присвоить null в некласса. С Еvent такое не пройдет....
До сих пор не понимаю, почему нельзя просто вызывать метод просто как Метод() или Класс.Метод()? То есть зачем что-то куда-то делегировать (не считая случаев, когда десять методов можно уложить в один красивый делегат)? А, и не понял, может ли класс "понять", что в каком-то другом классе произошло событие?
нихера не понял нет конкретного примера реализации, откуда берется событие хотя бы с кнопкой или как сделать событие при приходе инфы в сокет или в порт
Пожалуйста сделайте видео про invoke, invoke member. Почему в текст боксе используют invoke? Канал ваш просто огонь! Буду всем советовать. Спасибо вам!
Привет! Это важно, но не на столько, чтобы сильно заострять на этом внимание 🙂 Обработчик события добавляется через оператор +=, а удаляется через -=. Это достаточно простая операция. Гораздо важнее осознать уместность применения делегата и события.
Я начинающий разработчик на C#(в том смысле, что работаю разработчиком), просмотрел это видео. Хм. Вынужден признать одно из двух: либо я недостаточно умен, либо автору видео лучше прекратить говорить о том, что вопрос темы после просмотра видео будет закрыт раз и навсегда)). Как минимум надо оговориться - у большинства будет закрыт. @Автор, дам совет, можете как угодно к нему относится, тем не менее: все люди разные и находятся на разной стадии понимания каких-то вещей. Одни люди какие-то вещи вообще не понимают, другие соответственно другие вещи не понимают. НО. Каждый человек на планете делает какие-то базовые вещи, которые действительно делает любой. Ну например покупает продукты в магазине, ходит на работу, ездит на (каком-то) транспорте, живет в доме(квартире), дружит с друзьями, женат(или замужем) и тд. Сейчас объясню к чему это предисловие, так вот, это, скажем так, общие поля и методы класса человек, приводя "аналогии" к этим полям, методам, свойствам и тд можно объяснить практически все что угодно, имея достаточное воображение. Как можно объяснить что-то такое делегат? Например: я заказываю продукты питания через службу доставки, я передаю в службу список нужных мне продуктов и жду курьера. Всё. Я ДЕЛЕГИРОВАЛ сбор и доставку продуктов каким-то НЕИЗВЕСТНЫМ мне людям. Таким образом служба доставки это ДЕЛЕГАТ, который хранит ссылку на курьера, я передал делегату список продуктов, делегат вызвал курьера и передал ему список продуктов. Теперь для чего нужны делегаты? Можно ответить используя приведенный выше пример: я не знаю какой именно курьер(метод) будет собирать и доставлять продукты, я знаю только название службы доставки(имя делегата), это очень удобно для меня, так как избавляет меня от любых хлопот, я не думаю какой курьер будет вызван, какой у него номер телефона, где он находится в данный момент, в каком магазине он будет собирать для меня продукты и тд, и это удобно для службы доставки, она в любой момент может поменять курьера, если один заболел или уволился или слишком занят на другом заказе и при этом службе доставки не нужно никак уведомлять об этом меня, ведь я понятия не имею какой именно курьер будет осуществлять доставку. Примерно так. И при этом ни одной строчки кода)).
Делегат - это тип, который представляет ссылки на методы с определенным списком параметров и типом возвращаемого значения. При создании экземпляра делегата этот экземпляр можно связать с любым методом с совместимой сигнатурой и типом возвращаемого значения.22 сент. 2022 г. А вы говорите что делегат это класс ? Делегаты (Руководство по программированию на C#)
Многое прояснилось, хотя не до конца понял, чем конкретно во втором примере Congratulated() отличается от CalculateBonus() из первого, ведь его мы тоже можем теоретически делегировать сторонним классам. Все равно очень полезно, спасибо!
Да, кстати, а почему делегат объявляется вне класса Програм, а само событие - внутри класса Програм, но вне тела метода Main? Это вообще имеет какое-то решающее значение?
Хорошо, я в сотый раз понял, как объявлять эти делегаты и события, но я и в теории не могу представить, на кой мне они упёрлись, из-за чего не понимаю вообще как их использовать.
Спасибо за классную рубрику! Побольше бы таких видео про разные аспекты C#. Может быть, даже что-то про автоматизацию тестирования появится (не Unit-тесты, а именно QA Automation) Выйду на работу в следующем месяце, подпишусь на спонсортво канала
По поводу вашего интро о трассе 60: т.е. изначально невыполниме событие - выполнимо? бред. Что если всеразрушающая сила столкнётся с не разрушаемым объектом? А так в целом всё чикипуки. Так держать!
Вот мы и забрались в плоскость философии, а я так этого не хотел)) Не судите строго, через интро я пытаюсь немного снизить напряжение перед новой темой для слушателя.
Чувак, ты пытаешься найти смысл в шутливой отсылке к фильму, где упоминается событие. Тут про программирование, не про философию:) Цитаты это просто классная фишка автора
Что если всеразрушающая сила столкнётся с не разрушаемым объектом? Или ничего не произойдёт или будет бесконечное и бессмысленное противостояние. Если произойдёт иное, то либо сила была не такой уж "всеразрушающей", либо объект был не таким уж и "не разрушаемым".
Полез в делегаты, так как не могу вызвать метод с параметрами через Invoke, указав параметры именно в самом Invoke. Намекнули копать в сторону делегатов. Но пока не понял, поможет мне эта тема ?)
Не знаю точно Вашу ситуацию, но из представленной Вами информации могу предположить, что делагаты не имеют отношения к вопросу. Вероятно Вам следует использовать вызов метода через рефлексию и передать необходимые параметры через массив. Посмотрите информацию по этой ссылке, возможна она окажется полезной: stackoverflow.com/questions/38037614/invoke-method-with-reflection-pass-through-parameters-and-receive-a-return-value
Начал смотреть видео про делегаты и в один момент понял, что нужно сначала смотреть видео про события. Но в видео про события говорится, что всё таки нужно досмотреть про делегаты. Такие дела
Делагаты и события весьма тесно связаны. Сначала предлагается посмотреть видео про делагаты, а далее про события, так как событие - это логическое продолжение делегата.
Я правильно понимаю?: Подписавшись на событие ,оно может оповестить и через очень большое время в нужный момент? Делегаты нужны в первую очередь для инкапсуляции? Я просто который урок смотрю/читаю,вроде понимаю как работает,но не понимаю как это применить мне в моем пет проекте ,просто не могу въехать в суть надобности этих двух штук(
Нет-нет, пока Вы еще путаетесь. Но это очень-очень хорошо, так как путаница скоро закончится) Оповещение через "большое время" это не про события. События - это скорее про мгновенное оповещение и мгновенную реакцию на них. Например, у вас есть текстовое поле (пусть будет вес товара на рынке) и вы хотите выводить пользователю подсказку о том, что больше 40 кг продавать нельзя. Вы делаете событие на тот случай, когда пользователь вводит число, превышающее 40. Кто-то слушает это событие и при его получении показывает красную рамку или красное сообщение и т д. Или у вас какое-то сложное сетевое приложение, и вы видите, что вышел из строя какой-нибудь switch. Вы делаете событие и где-нибудь на форме мониторинга выводится оповещение оператору или высылается sms, например. Делегаты - это про делегирование. То есть нам нужно, чтобы логику выполнил кто-то извне. Например, расчёт процента для налога. У кого-то 13%, у кого-то 18% + дополнительная логика и т д.
Я чето все-равно не понял. Разница в том что делегат может возвращать параметры а событие нет ?. По сути чтобы оба типа жду ссылку на метод извне и будут по своему обрабатывать данные, в зависимости какой метод в них записали. Но делегат я могу создать такого же типа void как событие зачем мне событие тогда нужно?
В ролике я попытался объяснить концептуальное отличие между делегатами и событиями. Для каждой задачи есть своя абстракция. Если у вас есть модель события, зачем вы хотите использовать делегат в модели с событием? 🙂 Задумайтесь немного над этим вопросом. Вот другой пример: в переменной типа double мы можем хранить целочисленные значения типа integer, может попросить Microsoft убрать этот тип из dotnet? 😉 Вывод, к которому я подталкиваю, заключается в том, что необходимо брать правильную абстракцию подходящую под решение задачи.
Привет! Может быть я плохо дважды посмотрел ролик - не сплю целую ночь, ищу ответы. Вопрос в от в чем - зачем нужны события, если можно обычный метод вызвать и в этом методе вызывать другие методы? В чем такая ключевая фишка событий?
Привет! Конечно, мы можем вызывать обычные методы и даже должны это делать 🙂 Мы ни в коем случае не должны использовать события если сможем обойтись обычными методами. Событийная модель применяется, когда обычных методов нам не хватает. Например, когда вы создаете библиотеку. Вы не можете знать кто будет пользователем вашей библиотеки и из кода вашего класса вам нужно делать оповещения. То есть, вы просто не знаете какие методы нужно вызывать, но знаете, что какие-то точно нужно, потому в работе вашей библиотеки могут быть заинтересованы те, кто ее использует. Поэтому вы делаете что-то вроде слота подключения (событие) через который, другие люди могут передавать вам ссылки на методы, которые вы сможете вызывать. Если говорить супер грубо, но, чтобы вы уловили суть, события - это “дырка” в вашем классе, через которую вы сможете общаться с “другими”, но кто будут эти “другие” на момент создания программы вам неизвестно. Например, ваш класс отсылает SMS-сообщения и кому-то нужно считать все отосланные SMS-ки. Вы делаете эту дырку (событие) и производите оповещение после каждой отосланной SMS-ки. И все (кому это надо) подписываются на ваше событие и реагируют на него как хотят (например, считают количество отправленных SMS).
Нет, такой вывод неправильный. События, делегаты, методы, классы и т. д. - всё это различные инструменты, которые позволяют решать возникающие задачи. Все они должны применяться уместно. Не должно быть такого, что вы стараетесь применять что-то чаще, а что-то реже. Вы всегда должны задавать себе вопросы и давать на них ответы. Например: В действиях моего класса могут быть заинтересованы другие классы? Если да, то беру событие. Для работы моего метода потребуется внешняя логика? Если да, то беру делегат. Мой класс обязан знать логику расчета? Если да, то беру метод.