Про хер пойми откуда взявшийся класс это подмечено верно, долго не мог понять почему MovingEventArgs у него не подчёркивался а у меня да, полчаса убил на то чтобы найти директиву using, в итоге решил смотреть дальше и понял почему не работало. А так вроде понятно, но нихера не понял
Уже три года шКодю и только сейчас дошел до событий. Это наверное пятый урок в интернете на эту тему, и мне он показался самым разжеванным. Буду тыкать, штука явно полезная! Спасибо!
Этот урок нельзя просто посмотреть. А у новичков (я) он попросту не поместится в голове, не хватит объема внимания. В конце урока, я забыл о том, что было в начале. Рекомендую нажать на паузу и кодить параллельно с автором, но свои собственные классы. Более менее въехать, получилось только после того, как сам столкнулся с необходимостью использования событий в своих классах. Автору спасибо!
Andrey Kurganov Я новичок и мне хватает внимания, я думаю проблема в том, что он постоянно переключаеться между кусками кода и с первого раза почти никогда впринципе ничего не понятно в програмировании
Понимаю, что прошло 2.5 года, но вдруг полезно будет. Лучше бы писать новый код (новое объяснение, например Move заменяете на Moving) ниже, или в новом классе, или закомментировав предыдущий код. Вкупе с Вашей методикой записи видео, как прыгание по различным файлам за рамками записываемой области экрана, и чистый белый фон везде - это всё получается довольно сумбурно. Тут Вы меняете название метода, куда-то прыгнули, там вы меняете объявление метода, обратно прыгнули, поменяли вызов делегата в другом методе, и т.д. и т.п. И считаю, что запись всего окна Visual Studio была бы предпочтительней. Хотя бы для того, чтобы ориентироваться, на каком файле Вы в данный момент. А ведь помимо этих файлов, Вы еще что-то открываете - и там тоже белый фон, и слайды, и всё это сводится в голове в кучу. Спасибо за внимание:) И большое спасибо за уроки:)
А какая разница? Ну пришлось бы тогда мотать вверх-вниз, и ты бы всё равно ничего не увидел. Тут надо одновременно держать все эти файлы перед глазами, чтобы понять для первого раза. Например, попробовать самому, открыть несколько окошек, разместить их рядом...
Спасибо автору за видео! Наконец разобрался) с открытой вижуал студией нужно было урок разбирать.. От себя добавлю, что делегаты одно из основополагающих понятий в C#. На основе делегатов строятся события и обработчики событий без которых сейчас никуда, а так же лямбда-выражения которые активно используются в C#. Поэтому делегатам нужно уделить достаточное внимание, иначе дальнейшее изучение C# зайдет в тупик. Так же о делегатах хорошо написано у Шилдта в "Полный справочник по C#".
Посмотрел 3 раза, запутался окончательно... Сел в текстовике напечатал весь этот код, закомментировал каждую строку и всё встало на свои места. Спасибо, урок супер! Очень интересна подробное описание реализации делегатов если понадобится достать данные с веб-сервера, ну или как минимум данные которые физически находятся дальше 1 метра от Вашего компьютера)
Очень толковые уроки! Мысли у автора не путаются с дикцией тоже все ок. Короче, не всем так дано! Менять ничего не нужно!!! С шарпом знаком давно, но для освежения информации в своей личной БД очень пригодилось)))
я прихожу к выводу, что для изучения делегатов и событий необходимо держать наготове таблетки от головной боли... :-)))))))))) мда.., тема сама по себе не из лёгких... Но видео толковое, спасибо!
Согласен с пред идущими комментариями, изложение на высоте. Всё понятно без вопросов (только начал изучать шарп). Делегаты - это похоже на обычные коллбэки из С/С++.
наконец-то я понял зачем нужны делегаты, спасибо автору. грубо говоря в методе мув мы хотим выводить данные в метод, для этого используем делегат метода
В примере со шагающим студентом (до обобщенных делегатов), строка ShowMessage method = Show; не нужна. Можно сделать просто Student.Move(10, Show); вместо Student.Move(10, method);
Если ваши друзья поссорились и не хотят друг друга ни слышать ни видеть. И один просит вас передать другому что он дурак, а другой что тот сам дурак, то вы делегат! =)
С четвертого раза разобрался в делегатах, но сил и желания на события уже не хватило, ушел за ними в вики. Если вы еще поддерживаете этот проект, перепишете пожалуйста этот урок, пусть будет раза в 2 длиннее, но понятнее, иначе он бесполезен. зы. попробуйте как нибудь уместить весь текст в одном экране, оперативной памяти не хватает что бы запомнить все методы и приходится бегать по видео туда сюда, что запутывает еще больше. а так, спасибо за уроки.
очень хороший урок. речь понятная, с правильной интонацией. одно пожелание - после очередного действия завершающегося компиляцией приложения, делать хорошую паузу, для того чтобы информация успевала усваиваться. т.е. лучше секунд 5-7 посмотреть на всплывающие сообщения, вместо 1-2..
Ну мне кажется, так как мы смотрим видео, а не находимся на лекции, не сложно(а как по мне нужно) временами самому ставить видео на паузу и обрабатывать информацию. Правда я так и не понял как исправить ошибку Thread.Sleep(1000); Error 1 The name 'Thread' does not exist in the current context
Очень хорошо все объяснено. С одной стороны, если более подробно, хронометраж будет минут 30-40 минимум. С другой стороны, краткость не равно минимализм: 1) больше внимания листингам: когда возник MovingEventHandler в первый раз, без объяснений, было неприятно, потратил время на поиск - а может класс стандартный? 2) переход на сами события - резкий и так и нет ответа, а зачем, если до этого комментировали подписку и все работало. Поменять бы местами вариант упрощенного синтаксиса и полный вариант создания события. Как итог: везде добавить немного комментариев, куда идем, зачем идем, что происходит, какой код должен быть у нас написан в компиляторе перед глазами. Спасибо вам!
Классно ! здорово ! все расставлено по полочкам . автор просто супер спасибо. вот только беда , я этот урок не совсем понял . самое главное я не понял как и где это применять . наверное еще не дорос до понимания этого урока .когда мне пригодиться и начну понимать когда мне это понадобиться тогда и разберусь и пойму этот урок . а пока следуем далее .
очень доступно, тем кто кричит о непонятности - почитайте Троелсена, там ад полный... А вот у Шилдта все очень доступно рассказывается (хотя Троелсен до делегатов и событий описывал исключительно - видимо забухал)
Единственное, что можно было ещё включить в видео - это осветить тему .Net совместимых событий (было в видео, но не подробно), зачем нужно поле EventArgs.Empty, провести некое разделение событий на собственные пользовательские и "встроенные" в классы "контролов" события (типа Button.Click и т.д.), включаемые в код при добавлении контролов.
Автор, спасибо за такие качественные уроки! У меня есть пара вопросов к вам: 1. Вы говорите, что класс, который используется в EventHandler должен быть унаследован от класса EventArgs. Но почему я могу использовать любой тип: string, int,..., собственный класс, не унаследованный от EventArgs, и при этом программа компилируется и работает нормально? 2. Сигнатура метода - это тип и порядок его выходных и входных параметров или только входных? В книге Шилдта говорится, что сигнатура - это имя метода и список его входных параметров (стр. 241).
Почему при Action , это влияет на читаемость кода, если при входном параметре в методе Move видно, что Action имеет только один входной строковый параметр в угловых скобках.
Если в метод Move нужно в самом классе Student передать число, то как тут быть, если он принимает не только число, а еще и второй аргумент? И где объявлять делегата?
Про делегаты - отлично. А вот про события не получилось понять даже после нескольких просмотров, перемоток туда-сюда... после статьи с хабра полегчало )
Для новичка непонятно как применять события и зачем это нужно. Как совет - лучше такие сложные темы начинать с конца - поставить понятную всем простую задачу и объяснить что без событий и делегатов она не решается. Вот, например, в статье на хабре все понятно объясняется (см ссылку ниже в комментах)
Я так понял что делегация, та, что в самом начале, где ShowMessage - это делегация метода? то-есть это нужно для того, что бы в классе, в который я его делегирую, инициализировать метод, в который я буду что то передавать, верно?
Не получается присвоить переменной типа делегат ссылку на метод. Сигнатура метода some_method: void(My_class a, My_class b); Присваиваю так: Delegate_type my_delegate = obj_1.some_method(obj_1, obj_2); Компелятор говорит, что неявное преобразование типа void к Delegate_type невозможно. Как быть?
чуть ошибся... делегат void(string), а метод Move с сигнатурой void(int), как тут разобраться без бутылки... или эти делегаты можно вообще объявлять к любым методам с любой сигнатурой, лишь бы получать что хочешь??? объясните пожалуйста....
Делегат - это ссылка на функцию. В рамках рассматриваемого примера мы передаем в метод Move делегат сигнатуры void(string) с тем, чтобы внутри метода Move вызвать передаваемую по ссылке функцию и передать ей некое строковое значение. И тут действительно совершенно необязательно совпадение сигнатур. Потому что параметры метода Move используются для перемещения некоторого объекта, а параметры делегата используются для трансляции некоторого сообщения.
14:31 EventHandler сказали что объясните почему он так называется позже но так и не сказали. Начал просматривать не зная как прописывать события но зная, что оно из себя представляет в принципе. Так вот когда "события" начали приспосабливать в существующею программу в голове все смешалось. Подход описывающий "события" крайне не удачный. Разумно сделать два отдельных урока один делегаты другой события. К "событиям" подойти как советовал "Алексей Пастухов" ссылаясь на статью "habrahabr.ru/post/213809/?". А уже потом событие со стандартным делегатом "EventHandler" Как-то так...
Не до конца понятно отличие открытого свойства (Action Moving) от события (event EventHandler Moving). Зачем ввели события если можно было бы ограничиться использованием свойств?
+Yuriy Smirnov А если несколько подписчиков у класса? Тогда последний "затрет" подписки остальных, запихнув в свойство Action Moving свой делегат. Значит надо делать не Action Moving, а List Moving, чтобы новый подписчик добавлял свой делегат в список, не трогая остальные. А список делегатов - это и есть событие, вуаля ) С удобным синтаксисом подписки/отписки. Т.е. событие - это просто удобное обертка над списком делегатов.
+Defazze, спасибо за ответ. Но у меня почему-то не затирается подписка и не возникает никаких ошибок если "подписаться" на СВОЙСТВО public MyAction Moving { get; set; } сразу двумя методами из класса Program. Подписка происходит точно также как если бы это было событие. Вот так: student.Moving += Show; student.Moving += Show1; При этом срабатывают оба метода и первый не затирается. MyAction это обычный делегат с сигнатурой void (string s), а Show1 ничем не отличаается от метода Show. Может Visual Studio 2015 сама научилась как то распознавать что в свойство передается не один метод, а два ???
+Yuriy Smirnov Нет, Visual Studio "сама" ничего не распознает ) Дело в том, что делегаты в C# являются multicast, т.е. широковещательными, т.е. могут вызывать несколько методов, через оператор +=. Что у Вас и происходит. Т.е. это нормальное поведение. Другое дело, что в случае свойства разработчик может случайно "перетереть" делегат, использовав оператор = вместо +=. А в случае события это невозможно.
+Defazze, все-таки (предполагая, что мы расставили все операторы без ошибок), получается, что благодаря тому что мы имеем multicast делегаты (а не просто делагаты), можно обойтись вообще без событий. Тогда получается, что событие - это избыточный термин, а наиболее корректную его формулировку (которой почему-то нигде нет!) можно обозначить так: Событие - это открытое свойство типа массива делегатов, где вместо методов get и set используются методы add и remove
+Yuriy Smirnov Это интересная точка зрения ) Во-первых, определение события через делегат все-таки есть, вот сходу гуглится: msdn.microsoft.com/ru-ru/library/8627sbea.aspx. "События это особый тип многоадресных делегатов, которые можно вызвать только из класса или структуры, в которой они объявлены (класс издателя)". Здесь же мы видим еще одно ограничение на событие по сравнению со свойством. Во-вторых, в C# при желании можно вообще все что угодно определить через методы ). Ибо ничего кроме методов и полей в MSIL не существует. Свойство - это метод, конструктор класса - это метод, событие - это тоже метод. Дополнительные же сущности вводятся исключительно для удобства разработчиков.
Чуть чуть размыто объяснил для чего нужны делегаты. Их основная функция, обращение в другой поток ( к методу и тд ). Т.к. на прямую мы не сможем получить данные. Само понятие слова Делегат уже дает огромный ответ))
4:15 , я учусь программированию по вашим урокам, работаю в новой среде Visual Studio, в вашем примере, ноль в фигурных скобках другого цвета и назначения нежели все остальное, я не могу добиться того же, он у меня относится ко всему прочему в кавычках.
using System; using System.Collections.Generic; using System.Collections; using System.Text; return inputString.Count(c => c == 'A'); Count подсвечивается красным. Не могу понять в чем дело. Может быть из за того что использую Xamarin вместо VS ? Просто на работе не могу поставить VS, а уроки иногда смотрю с работы.
В сигнатуру метода не входит тип возвращаемого значения! Только имя метода и типы его параметров (порядок важен). Но если рассматривать в контексте делегатов, то грубо с искажением так в принципе можно назвать.
Разобрался что такое делегат и зачем он нужен, понял что такое событие, но не могу понять почему мы не можем напрямую вызвать метод заместо события? кто-то может пояснить. может на простом примере
Что интересно, в МСДН сигнатура (не в случае делегатов) определяется по другому. Например, msdn.microsoft.com/ru-ru/library/ms173114.aspx А у Рихтера - так, как в видео.
+Alexander Osipov В контексте перегрузки метода его сигнатура не содержит возвращаемое значение. Однако в контексте делегатов, сигнатура содержит возвращаемое значение. Другими словами, метод должен иметь тот же возвращаемый тип, что и делегат. msdn.microsoft.com/ru-ru/library/ms173171.aspx
Урок трудноватый, картина остается смазанная. + в уроке не сказано какие использовать библиотеки - иногда возникает ошибка на ровном месте из-за не подключенной директивы.
посоны, я за 4 месяца джаву подтянул, там с callback ами поработал. Случайно наткнулся на этот урок и посмотрел - ну че могу сказать, все собственно понятно, не особо то и сложно)) тут видимо дело опыта) не знаю..) ну и подача такая, что если вы без опыта, хрен что поймете)
просто человек прыгает с кода в код. Что бы было все понятно нужно видеть полностью весь код. А не там поменял там поменял, там еще не успел изменить. Крч хаос
3 урок и все, мой мозг поплавился) Не в укор автору, сам урок нравится и все достаточно разжеванно, нужно чтобы в голове еще уложилось)
до 15 минуты все вроде как понятно.. а потом дичь пошла... хер пойми откуда новый класс взялася там еще и еще... кароче очень мудрено
Потапов Борис Да, я еще обощенные типы прохожу, а тут делегаты и события. До 15 минуты норм, а потом каша
Про хер пойми откуда взявшийся класс это подмечено верно, долго не мог понять почему MovingEventArgs у него не подчёркивался а у меня да, полчаса убил на то чтобы найти директиву using, в итоге решил смотреть дальше и понял почему не работало. А так вроде понятно, но нихера не понял
Я С ЭТИМИ СОБЫТИЯМИ МОЗГ ЛОМАЮ ТРЕТИЙ ДЕНЬ.... ИЛИ Я ТУПОЙ ИЛИ ЧТО-ТО УПУСКАЮ
Уже три года шКодю и только сейчас дошел до событий. Это наверное пятый урок в интернете на эту тему, и мне он показался самым разжеванным. Буду тыкать, штука явно полезная! Спасибо!
Этот урок нельзя просто посмотреть. А у новичков (я) он попросту не поместится в голове, не хватит объема внимания. В конце урока, я забыл о том, что было в начале. Рекомендую нажать на паузу и кодить параллельно с автором, но свои собственные классы. Более менее въехать, получилось только после того, как сам столкнулся с необходимостью использования событий в своих классах.
Автору спасибо!
Andrey Kurganov Я новичок и мне хватает внимания, я думаю проблема в том, что он постоянно переключаеться между кусками кода и с первого раза почти никогда впринципе ничего не понятно в програмировании
Понимаю, что прошло 2.5 года, но вдруг полезно будет.
Лучше бы писать новый код (новое объяснение, например Move заменяете на Moving) ниже, или в новом классе, или закомментировав предыдущий код. Вкупе с Вашей методикой записи видео, как прыгание по различным файлам за рамками записываемой области экрана, и чистый белый фон везде - это всё получается довольно сумбурно. Тут Вы меняете название метода, куда-то прыгнули, там вы меняете объявление метода, обратно прыгнули, поменяли вызов делегата в другом методе, и т.д. и т.п.
И считаю, что запись всего окна Visual Studio была бы предпочтительней. Хотя бы для того, чтобы ориентироваться, на каком файле Вы в данный момент. А ведь помимо этих файлов, Вы еще что-то открываете - и там тоже белый фон, и слайды, и всё это сводится в голове в кучу.
Спасибо за внимание:) И большое спасибо за уроки:)
Огромный плюс!
Было бы проще понять витки кода если бы ты в одном файле всё делал, а не переключался по кускам кода. А так урок супер, очень иформативно.
Согласен, урок огонь, но приходится постоянно отматывать, чтобы посмотреть реализацию того или иного метода
А какая разница? Ну пришлось бы тогда мотать вверх-вниз, и ты бы всё равно ничего не увидел. Тут надо одновременно держать все эти файлы перед глазами, чтобы понять для первого раза. Например, попробовать самому, открыть несколько окошек, разместить их рядом...
Очень содержательно и доходчиво - спасибо! На фоне прочего шлака ваши видео просто клад.
Хардкорные примеры! Далой простые примеры! Это лучшее средство заставить свой мозг работать. Хороший урок.
Спасибо автору за видео! Наконец разобрался) с открытой вижуал студией нужно было урок разбирать..
От себя добавлю, что делегаты одно из основополагающих понятий в C#. На основе делегатов строятся события и обработчики событий без которых сейчас никуда, а так же лямбда-выражения которые активно используются в C#. Поэтому делегатам нужно уделить достаточное внимание, иначе дальнейшее изучение C# зайдет в тупик.
Так же о делегатах хорошо написано у Шилдта в "Полный справочник по C#".
Посмотрел множество каналов, но Вы рассказываете наиболее понятно. Спасибо)
Самый лучший видео урок по C# из всех что я видел.COOL )
автор молодец! Уроки доходчивые и слушать очень приятно! Так держать!
Спасибо большое! Отличный видеоурок, давно не мог понять эту тему.
спустя 3 месяца, ещё раз посмотрел урок и вкурил о_О. Спасибо ^_^
Начал доучивать пробелы. Офигенно свел делегаты к событиям. Я разобрался с делегатами. Пасиб.
Лучшие видео уроки, которые я встречал!! Спасибо!
На мой взгляд это самые доходчивые уроки по C#. Автору респект и лайк!
Спасибо, автор! Пересматривала раза четыре, но таки разобралась))
Концентрация годноты!!! Спасибо! Агонь-пожар!
Спасибо за подробное объяснение механизма работы событий!
Посмотрел 3 раза, запутался окончательно... Сел в текстовике напечатал весь этот код, закомментировал каждую строку и всё встало на свои места. Спасибо, урок супер! Очень интересна подробное описание реализации делегатов если понадобится достать данные с веб-сервера, ну или как минимум данные которые физически находятся дальше 1 метра от Вашего компьютера)
Спасибо, благодаря вам, тема становится понятнее!
простым языком, делегаты - вызов функции в функции
не, делегат - это не вызов функции, это ссылка на функцию или несколько функций сразу.
Я ничего не понял =(
Запутался на половине урока
всегда можно запустить ещё раз))
До конца не понял, но сама методика обучения очень понравилась, 5+! Спасибо большое!
Очень толковые уроки! Мысли у автора не путаются с дикцией тоже все ок. Короче, не всем так дано! Менять ничего не нужно!!! С шарпом знаком давно, но для освежения информации в своей личной БД очень пригодилось)))
я прихожу к выводу, что для изучения делегатов и событий необходимо держать наготове таблетки от головной боли... :-)))))))))) мда.., тема сама по себе не из лёгких... Но видео толковое, спасибо!
самый лучший материал по этой теме . Большое спасибо
Согласен с пред идущими комментариями, изложение на высоте. Всё понятно без вопросов (только начал изучать шарп). Делегаты - это похоже на обычные коллбэки из С/С++.
Автору огромное спасибо!!!!!
наконец-то я понял зачем нужны делегаты, спасибо автору. грубо говоря в методе мув мы хотим выводить данные в метод, для этого используем делегат метода
Спасибо большое. Очень хорошо описано!
все ясно и доступно объяснил, респект!
Ох..енные ролики, благодарю от души.
Все супер. Не знаю возможно ли объяснить лучше, но я так и не въехал. Пиняю на себя. + Лайк и Подписка.
чтобы до конца вкурить надо использзовать
В примере со шагающим студентом (до обобщенных делегатов), строка ShowMessage method = Show; не нужна. Можно сделать просто Student.Move(10, Show); вместо Student.Move(10, method);
Очень доходчиво. Спасибо.
Если ваши друзья поссорились и не хотят друг друга ни слышать ни видеть. И один просит вас передать другому что он дурак, а другой что тот сам дурак, то вы делегат! =)
С четвертого раза разобрался в делегатах, но сил и желания на события уже не хватило, ушел за ними в вики.
Если вы еще поддерживаете этот проект, перепишете пожалуйста этот урок, пусть будет раза в 2 длиннее, но понятнее, иначе он бесполезен.
зы. попробуйте как нибудь уместить весь текст в одном экране, оперативной памяти не хватает что бы запомнить все методы и приходится бегать по видео туда сюда, что запутывает еще больше.
а так, спасибо за уроки.
Круто, спасибо за урок)
Это было божественно
нереально круто обяснив......супер!!!!
спасибо, очень доступно для понимания!
хороший урок. очень понятно про делегаты рассказано. спасибо
Отличный урок, спасибо! Наконец то понял, что такое делегаты! Урааа
Спасибо за хорошо изложенную тему
очень хороший урок. речь понятная, с правильной интонацией.
одно пожелание - после очередного действия завершающегося компиляцией приложения, делать хорошую паузу, для того чтобы информация успевала усваиваться.
т.е. лучше секунд 5-7 посмотреть на всплывающие сообщения, вместо 1-2..
Ну мне кажется, так как мы смотрим видео, а не находимся на лекции, не сложно(а как по мне нужно) временами самому ставить видео на паузу и обрабатывать информацию.
Правда я так и не понял как исправить ошибку
Thread.Sleep(1000);
Error 1 The name 'Thread' does not exist in the current context
AndDark777 using System.Threading; хотя думаю за 6 месяцев вы нашли проблему)
Cat Worldson Спасибо)) Действительно нашел
Спасибо за уроки. Чем мог поддержал
Понравилось, все просто и понятно
Отличный урок!
Да, про события малех мудрено вышло, но фцелом полезно. Лейпциг за труды
Всем кто не вникает с первого раза советую почитать литературу, того же Троелсена.
А автор молодец, очень толково объясняет. Успехов тебе чувак!!!
Спасибо) очень помогло 👍
Очень хорошо все объяснено. С одной стороны, если более подробно, хронометраж будет минут 30-40 минимум. С другой стороны, краткость не равно минимализм: 1) больше внимания листингам: когда возник MovingEventHandler в первый раз, без объяснений, было неприятно, потратил время на поиск - а может класс стандартный? 2) переход на сами события - резкий и так и нет ответа, а зачем, если до этого комментировали подписку и все работало. Поменять бы местами вариант упрощенного синтаксиса и полный вариант создания события. Как итог: везде добавить немного комментариев, куда идем, зачем идем, что происходит, какой код должен быть у нас написан в компиляторе перед глазами. Спасибо вам!
Тема и правда сложная, но после этого ролика все сразу стало понятно)
Большое спасибо!
Классно ! здорово ! все расставлено по полочкам . автор просто супер спасибо.
вот только беда , я этот урок не совсем понял . самое главное я не понял как и где это применять . наверное еще не дорос до понимания этого урока .когда мне пригодиться и начну понимать когда мне это понадобиться тогда и разберусь и пойму этот урок . а пока следуем далее .
очень доступно, тем кто кричит о непонятности - почитайте Троелсена, там ад полный... А вот у Шилдта все очень доступно рассказывается (хотя Троелсен до делегатов и событий описывал исключительно - видимо забухал)
Единственное, что можно было ещё включить в видео - это осветить тему .Net совместимых событий (было в видео, но не подробно), зачем нужно поле EventArgs.Empty, провести некое разделение событий на собственные пользовательские и "встроенные" в классы "контролов" события (типа Button.Click и т.д.), включаемые в код при добавлении контролов.
Спасибо, всё круто. Только пишите декларацию и имплементацию на одном слайде, чтобы не ставить на паузу и постоянно перематывать назад вперёд.
Автор, спасибо за такие качественные уроки! У меня есть пара вопросов к вам:
1. Вы говорите, что класс, который используется в EventHandler должен быть унаследован от класса EventArgs. Но почему я могу использовать любой тип: string, int,..., собственный класс, не унаследованный от EventArgs, и при этом программа компилируется и работает нормально?
2. Сигнатура метода - это тип и порядок его выходных и входных параметров или только входных? В книге Шилдта говорится, что сигнатура - это имя метода и список его входных параметров (стр. 241).
И входных и выходных: void(int, char) и int(int, char) - обладают разной сигнатурой.
Почему при Action , это влияет на читаемость кода, если при входном параметре в методе Move видно, что Action имеет только один входной строковый параметр в угловых скобках.
До этого думал что все идет хорошо, но после видео чет понял что я тупой(( Автору спасибо, очень интерестно и информативно.
Если в метод Move нужно в самом классе Student передать число, то как тут быть, если он принимает не только число, а еще и второй аргумент?
И где объявлять делегата?
Спасибо!
Всё понятно спасибо
Про делегаты - отлично. А вот про события не получилось понять даже после нескольких просмотров, перемоток туда-сюда... после статьи с хабра полегчало )
спасибо!
крутой урок все понятно
супер!
Ого, третий урок и уже сразу делегаты
Для новичка непонятно как применять события и зачем это нужно. Как совет - лучше такие сложные темы начинать с конца - поставить понятную всем простую задачу и объяснить что без событий и делегатов она не решается. Вот, например, в статье на хабре все понятно объясняется (см ссылку ниже в комментах)
Любую задачу можно решить даже используя только if/else
давно о таком мечтал
спасибо
Я так понял что делегация, та, что в самом начале, где ShowMessage - это делегация метода? то-есть это нужно для того, что бы в классе, в который я его делегирую, инициализировать метод, в который я буду что то передавать, верно?
Спасибо
А есть ли у вас уроки в текстовом варианте?
Автор, какие пространства имён здесь подключены?
Не получается присвоить переменной типа делегат ссылку на метод.
Сигнатура метода some_method: void(My_class a, My_class b);
Присваиваю так: Delegate_type my_delegate = obj_1.some_method(obj_1, obj_2);
Компелятор говорит, что неявное преобразование типа void к Delegate_type невозможно. Как быть?
Вот так: Delegate_type my_delegate = obj_1.some_method
Defazze Спасибо за оперативный ответ и отличную лекцию! ах невнимательность(
Подписка += 1;
Лайк += 1;
Изучаю С++ и С# в ВУЗе... Жаль что раньше на твой канал не набрёл...
Хороший урок, но хотелось бы контрольных заданий по теме. А то теорию вроде в голове укладываю, а на практике своё реализовать не получается...
7:19 вот тут Магия. Метод я так понимаю из делегата образовывается?
12:50 вот здесь я начал злиться. Я не пойму это другой метод или то же свойство?
Т.е как я понял, делегат это аналог указателя на функцию в чистом СИ, верно? Ну, если на высоком уровне рассматривать, разумеется
Делегат получается указатель на функцию?
чуть ошибся... делегат void(string), а метод Move с сигнатурой void(int), как тут разобраться без бутылки... или эти делегаты можно вообще объявлять к любым методам с любой сигнатурой, лишь бы получать что хочешь??? объясните пожалуйста....
Делегат - это ссылка на функцию. В рамках рассматриваемого примера мы передаем в метод Move делегат сигнатуры void(string) с тем, чтобы внутри метода Move вызвать передаваемую по ссылке функцию и передать ей некое строковое значение. И тут действительно совершенно необязательно совпадение сигнатур. Потому что параметры метода Move используются для перемещения некоторого объекта, а параметры делегата используются для трансляции некоторого сообщения.
14:31 EventHandler сказали что объясните почему он так называется позже но так и не сказали.
Начал просматривать не зная как прописывать события но зная, что оно из себя представляет в принципе.
Так вот когда "события" начали приспосабливать в существующею программу в голове все смешалось.
Подход описывающий "события" крайне не удачный.
Разумно сделать два отдельных урока один делегаты другой события.
К "событиям" подойти как советовал "Алексей Пастухов" ссылаясь на статью "habrahabr.ru/post/213809/?".
А уже потом событие со стандартным делегатом "EventHandler"
Как-то так...
по сути, делегат позволяет реализовать паттерн стратегия на уровне интерфейса функции (определяемого сигнатурой), если я верно понял
Не до конца понятно отличие открытого свойства (Action Moving) от события (event EventHandler Moving). Зачем ввели события если можно было бы ограничиться использованием свойств?
+Yuriy Smirnov А если несколько подписчиков у класса? Тогда последний "затрет" подписки остальных, запихнув в свойство Action Moving свой делегат. Значит надо делать не Action Moving, а List Moving, чтобы новый подписчик добавлял свой делегат в список, не трогая остальные. А список делегатов - это и есть событие, вуаля ) С удобным синтаксисом подписки/отписки.
Т.е. событие - это просто удобное обертка над списком делегатов.
+Defazze, спасибо за ответ. Но у меня почему-то не затирается подписка и не возникает никаких ошибок если "подписаться" на СВОЙСТВО public MyAction Moving { get; set; } сразу
двумя методами из класса Program. Подписка происходит точно также как если бы это было событие. Вот так: student.Moving += Show; student.Moving += Show1; При этом срабатывают оба метода и первый не затирается. MyAction это обычный делегат с сигнатурой void (string s), а Show1 ничем не отличаается от метода Show. Может Visual Studio 2015 сама научилась как то распознавать что в свойство передается не один метод, а два ???
+Yuriy Smirnov Нет, Visual Studio "сама" ничего не распознает ) Дело в том, что делегаты в C# являются multicast, т.е. широковещательными, т.е. могут вызывать несколько методов, через оператор +=. Что у Вас и происходит. Т.е. это нормальное поведение.
Другое дело, что в случае свойства разработчик может случайно "перетереть" делегат, использовав оператор = вместо +=. А в случае события это невозможно.
+Defazze, все-таки (предполагая, что мы расставили все операторы без ошибок), получается, что благодаря тому что мы имеем multicast делегаты (а не просто делагаты), можно обойтись вообще без событий.
Тогда получается, что событие - это избыточный термин, а наиболее корректную его формулировку (которой почему-то нигде нет!) можно обозначить так: Событие - это открытое свойство типа массива делегатов, где вместо методов get и set используются методы add и remove
+Yuriy Smirnov Это интересная точка зрения )
Во-первых, определение события через делегат все-таки есть, вот сходу гуглится: msdn.microsoft.com/ru-ru/library/8627sbea.aspx. "События это особый тип многоадресных делегатов, которые можно вызвать только из класса или структуры, в которой они объявлены (класс издателя)". Здесь же мы видим еще одно ограничение на событие по сравнению со свойством.
Во-вторых, в C# при желании можно вообще все что угодно определить через методы ). Ибо ничего кроме методов и полей в MSIL не существует. Свойство - это метод, конструктор класса - это метод, событие - это тоже метод. Дополнительные же сущности вводятся исключительно для удобства разработчиков.
Кстати. А имеет ли смысл создавать разные делегаты для разных событий? Вроде как не нужно - и всё же такая возможность существует.
О делегатах в ключе ФП пишется на RSDN в статье о LINQ
Чуть чуть размыто объяснил для чего нужны делегаты. Их основная функция, обращение в другой поток ( к методу и тд ). Т.к. на прямую мы не сможем получить данные. Само понятие слова Делегат уже дает огромный ответ))
4:15 , я учусь программированию по вашим урокам, работаю в новой среде Visual Studio, в вашем примере, ноль в фигурных скобках другого цвета и назначения нежели все остальное, я не могу добиться того же, он у меня относится ко всему прочему в кавычках.
+Alex Ignatjev У меня установлен плагин к Visual Studio, называется ReSharper, вероятно это его рук дело )
а разве возвращаемый тип входит в понятие сигнатуры ? согласно спецификации.
скорее всего уже просили делать что-то вроде заданий для самостоятельной работы
ага, спс.
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
return inputString.Count(c => c == 'A');
Count подсвечивается красным.
Не могу понять в чем дело.
Может быть из за того что использую Xamarin вместо VS ? Просто на работе не могу поставить VS, а уроки иногда смотрю с работы.
+FeuermagierDerr добавь using System.Linq;
+Алексей Сокол спасибо
+super
В сигнатуру метода не входит тип возвращаемого значения! Только имя метода и типы его параметров (порядок важен). Но если рассматривать в контексте делегатов, то грубо с искажением так в принципе можно назвать.
Разобрался что такое делегат и зачем он нужен, понял что такое событие, но не могу понять почему мы не можем напрямую вызвать метод заместо события? кто-то может пояснить. может на простом примере
Что интересно, в МСДН сигнатура (не в случае делегатов) определяется по другому. Например, msdn.microsoft.com/ru-ru/library/ms173114.aspx А у Рихтера - так, как в видео.
+Alexander Osipov В контексте перегрузки метода его сигнатура не содержит возвращаемое значение. Однако в контексте делегатов, сигнатура содержит возвращаемое значение. Другими словами, метод должен иметь тот же возвращаемый тип, что и делегат.
msdn.microsoft.com/ru-ru/library/ms173171.aspx
это нужно параллельно отрабатывать в VS c отладчиком, чтобы понять с первого раза
Сигнатура метода - это имя метода плюс параметры(причем порядок параметров имеет значение). В сигнатуру метода не входит возвращаемое значение.
в контексте делегатов входит
Урок трудноватый, картина остается смазанная. + в уроке не сказано какие использовать библиотеки - иногда возникает ошибка на ровном месте из-за не подключенной директивы.
сложна сложна, че так сложна ??? нифига же не понятно
посоны, я за 4 месяца джаву подтянул, там с callback ами поработал. Случайно наткнулся на этот урок и посмотрел - ну че могу сказать, все собственно понятно, не особо то и сложно)) тут видимо дело опыта) не знаю..) ну и подача такая, что если вы без опыта, хрен что поймете)
просто человек прыгает с кода в код. Что бы было все понятно нужно видеть полностью весь код. А не там поменял там поменял, там еще не успел изменить. Крч хаос
+oleg iaremchuk +