background top icon
background center wave icon
background filled rhombus icon
background two lines icon
background stroke rhombus icon

Скачать "Обобщения или шаблоны (Generic) в C# - Учим Шарп #12"

input logo icon
Теги видео
|

Теги видео

обобщения c#
обобщения
дженерики c#
обобщение c#
универсальный тип c#
шаблоны c#
generics c#
generic c#
generic
generics
шаблоны
обобщение
дженерики
универсальный тип
программирование c#
программист c#
программирование
программист
c# программирование
c#
с#
.net
c sharp
csharp
visual studio c#
it
visual c#
dotnet
си шарп
c# уроки
программирование с нуля
уроки c#
c# для начинающих
c# курс
c# уроки для начинающих
code blog
шванов вадим
учим шарп
codeblog
ityoutubersru
разработка
Субтитры
|

Субтитры

subtitles menu arrow
  • enАнглийский
Скачать
00:00:11
добрейшей вечер
00:00:13
я надеюсь
00:00:15
видно и слышно если это так пожалуйста
00:00:17
напишите в комментариях чтобы я знал что
00:00:19
все хорошо и мы могли спокойно
00:00:22
заниматься изучением языка сишарп а
00:00:26
соответственно сегодня у нас достаточно
00:00:28
важно интересная тема это так называемые
00:00:32
дженерики
00:00:34
или шаблоны или универсальное
00:00:38
[музыка]
00:00:42
универсальный тип и или блин как их
00:00:46
только не называют обобщение то есть
00:00:49
куча название все это по своей сути
00:00:52
синонимы
00:00:53
привет макс да вижу что все хорошо
00:00:57
отлично а вот соответственно название
00:01:00
много используется часто
00:01:05
важный вопрос часто спрашивают у тех же
00:01:08
самых джунов на собеседования то есть
00:01:11
если прошу прощение планируете
00:01:15
устраивается на работу с большой долей
00:01:18
вероятности вам как раз таки по этой
00:01:20
теме будет задан вопрос при том это
00:01:22
считается вопрос ну скажем так не совсем
00:01:24
базовый уже
00:01:27
если что-то как бы человек понимает уже
00:01:31
можно спросить там project origin и реки
00:01:33
вот если ничего не понимает то там про
00:01:36
какой-нибудь iv и спрашивают про
00:01:41
ссылочный значимый тебя вот в этом плане
00:01:43
вот соответственно изучаем шаблоны
00:01:51
сначала как обычно немного поговорим про
00:01:54
логику про смысл зачем это нужно
00:01:59
кто виноват и что делать а после этого
00:02:03
соответственно как обычно уже будем
00:02:06
смотреть на практике откроем среду
00:02:07
разработки и будем немножко там писать
00:02:11
кода код который будет на занятия также
00:02:15
выложу на git хоп то есть вы при желании
00:02:17
сможете в любой момент зайти посмотреть
00:02:21
там скачать модифицировать себе хотя там
00:02:24
будут такие чисто чисто теоретически
00:02:29
примеры без реального разбора в
00:02:31
дальнейшем в будущем я планирую как раз
00:02:34
таки посвятить
00:02:36
курс полноценной разработки проекта от 0
00:02:41
с нуля с полного вот придумывание идей и
00:02:45
написание там какого-то себе плана да
00:02:48
допустим до конечного результата но для
00:02:53
того чтобы приступить к этому плану нам
00:02:56
необходимо нам необходимо для начала как
00:03:02
раз таки изучить базовый синтаксис языка
00:03:05
соответственно уже знает синтаксис уже
00:03:09
можно будет что-то реализовывать так
00:03:13
соответственно перед началом должен
00:03:16
напомнить что в рамках этого для этого
00:03:20
курса я завел специальную рассылку в
00:03:23
группе вконтакте ссылочка на нее есть в
00:03:26
описании под видео если подписаться на
00:03:31
эту рассылку вы будете получать
00:03:33
уведомления о предстоящих уроках а также
00:03:38
ссылки на ранее публику
00:03:40
она опубликованные занятие на
00:03:42
дополнительные какие-то материалы и
00:03:44
также есть специальные чат в телеграме
00:03:49
специально для этого курса по оси шарпу
00:03:53
соответственно ссылочка на него тоже
00:03:55
есть в описании поэтому
00:03:58
там уже свободное общение по языку со
00:04:02
всеми участниками которые изучают сша
00:04:05
вместе с вами тоже смотрит этой курс там
00:04:08
можно посмотреть ссылки на все
00:04:10
предыдущие записи
00:04:12
и также дополнительные материалы и какие
00:04:14
то вопросы задавать либо я отвечу либо
00:04:16
кто-то уже кто знает тоже в чате могут
00:04:20
вам подсказать также у меня есть группа
00:04:24
вконтакте общей телеграм-канал цен блог
00:04:29
где публику
00:04:30
материалы по всем языкам
00:04:34
программирования также развлекательные
00:04:36
материалы также какие-то общие статьи
00:04:39
все все вот на этих ресурсах можно
00:04:42
почитать посмотреть все полезное для
00:04:44
программистов
00:04:45
вот и также если в правом верхнем углу
00:04:49
нажать на буковку и на у вид на вот эти
00:04:55
вот оповещение на подсказки там можно найти
00:04:58
ссылки на плейлист и моего канала также
00:05:02
подпишитесь на канал и поставьте лайк
00:05:04
если вам понравится это видео ну а
00:05:07
теперь я думаю со вводной частью мы
00:05:09
можем спокойно заканчивать все кто
00:05:11
хотели принять участие в курсе я думаю
00:05:15
уже подключились поэтому будем
00:05:19
приступать и так и так и так и так
00:05:22
тема наша для меня привычнее всего
00:05:26
назвать их шаблоны поэтому по
00:05:27
возможности я буду если вы не против
00:05:31
из использовать именно это наименование
00:05:34
то есть шаблон и соответственно что это
00:05:37
такое шаблона это своеобразное
00:05:43
своеобразное ну условно можно
00:05:46
представить себе как переменная для типа
00:05:48
переменных вот такая вот такой вот
00:05:51
хитрое определение которое
00:05:53
соответственно не совсем правильная
00:05:56
однако она описывает основную логику то
00:06:02
есть мы можем задать
00:06:05
какой то анонимный
00:06:09
тип как нам задумывается его назвать это
00:06:15
принц не принципиально и в дальнейшем мы
00:06:18
на место на все места упоминания это
00:06:22
этого типа можем динамически подставлять
00:06:26
необходимый тип реальный то есть мы
00:06:30
точно также как переменную мы объявляем
00:06:32
переменную как какую-то коробочку куда
00:06:36
можем положить любое значение там можем
00:06:39
положить винтовую переменную пятерку
00:06:42
можем положить семерку можем десятку не
00:06:44
принципиально мне кажется я слишком
00:06:46
громко звучу и
00:06:51
так сейчас я чуть потише сделала то
00:06:54
похожий звук зашкаливает я сегодня
00:06:56
какой-то громкий вот соответственно
00:07:00
переменная можно представить как
00:07:03
коробочку куда можно положить любые
00:07:05
любые значения определенного типа и
00:07:12
соответственно вот этот вот шаблон вот
00:07:16
этот универсальный тип это обобщение как
00:07:19
хотите так называть вот я вижу что меня
00:07:22
поправляют что шаблоны немного другое
00:07:24
понятие но много именования 1 этаже но
00:07:29
привык я к этому ну вот припяти меня за
00:07:32
это но вот вообще это правильно
00:07:36
называется универсальный тип и
00:07:38
универсальные типы но вот мы не приелось
00:07:41
идти шаблоны вот так и зову
00:07:45
соответственно мы можем определить
00:07:49
шаблон
00:07:50
то есть своеобразно переменную и вот под
00:07:55
это имя какое-то универсальное мы можем
00:07:58
подставить
00:07:59
любой тип данных то есть не конкретное
00:08:01
значение туда ложить а конкретные типы
00:08:05
данных то есть мы можем везде объявить
00:08:08
там tab tab tab tab tab и на этапе
00:08:13
написание кода мы как раз таки будем
00:08:15
динамически подставили int везде где
00:08:17
упоминал считает стала значение значение
00:08:21
in the вы передали string у нас тип
00:08:26
везде стал стрингами
00:08:27
это позволяет нам одновременно сделать
00:08:30
как динамическую по сути типизацию то
00:08:36
есть мы не определяем жестко какой
00:08:40
конкретный тип
00:08:41
на этапе написание кода то есть
00:08:43
своеобразного динамик у нас появляется
00:08:45
но при этом оставаться строго
00:08:48
типизированным то есть если мы задали
00:08:50
для этого типа
00:08:53
что он энтого это везде будет энтого и
00:08:56
значение на самом деле и никакое другое
00:08:58
туда подставить меняет не сможем вот как
00:09:03
бы идея так в этом то есть сначала
00:09:08
обобщенное определение потом на этапе
00:09:11
выполнена на этапе использование в коде
00:09:15
мы говорим что не именно винтовые должно
00:09:19
быть и
00:09:21
большим уже как бы ничего понять не
00:09:23
можем задали конкретно int ну а теперь
00:09:27
на давайте наверное приступать к
00:09:29
практике это лучше уже показать на
00:09:30
практике я сделаю камеру поменьше запущу
00:09:34
так дать дайте-ка я если не против
00:09:39
камеру поменяю
00:09:42
секунду вот так и я в другую сторону
00:09:53
развёрнут а вот короче запускаем виралку
00:09:59
а вы пока
00:10:00
накиньте какую-нибудь тему предметную
00:10:03
область которая вам интересна которую
00:10:05
будем рассматривать которую по которой
00:10:09
как раз таки будем сегодня делать
00:10:10
занятия любую тему которая вам может
00:10:15
быть ваша предметная область по которой
00:10:18
вы делаете задание или просто какую-то
00:10:21
интересную тему накиньте или что угодно
00:10:24
то есть прямо в комментарии напишите и я
00:10:27
тогда посмотрю что самое интересное
00:10:32
будет и тогда соответственно либо первую
00:10:35
выберу либо то который мне больше
00:10:36
понравится я все-таки автор я смогу
00:10:39
повлиять так создадим консольное
00:10:43
приложение точно также
00:10:45
назовем его
00:10:48
с 12 free word 447 оставим где чувак с
00:11:10
магазинчикам дома можем если есть
00:11:15
желание
00:11:16
если ни у кого больше нет идей в
00:11:18
принципе я без проблем могу взять ту же
00:11:20
самую тему которую в прошлый раз брали
00:11:24
или или свою какую то придумать если
00:11:29
сейчас ближайшее время нет нет ничего не
00:11:32
напишете то тогда будем будем
00:11:36
чего-нибудь мутить ну похоже
00:11:40
ничего такого нет давайте смотреть тогда
00:11:45
что у нас был был магазин спортивных
00:11:50
товаров
00:11:51
да вот давайте эту же тему и оставим так
00:11:58
что нам нужно нам нужно создать класс
00:12:04
пусть
00:12:06
чтобы последовательно ну давай так газин
00:12:13
спортивных товаров
00:12:15
у нас там продукт был по моим
00:12:22
давай тут же про яблоко учет калорий да
00:12:29
у нас был учет калорию все я вспомнил
00:12:31
память память уже не та память уже это
00:12:38
как раз тема моей сегодняшней рассылке
00:12:40
вконтакте так продукт так создаем класс
00:12:47
продукт public продукт так у нас продукт
00:12:59
был нет мы не будем сегодня в эту
00:13:03
сторону то есть рассматривать а сделан
00:13:06
просто какой-то универсальный продукт и
00:13:09
для него как раз таки и определим так
00:13:12
продукту у нас есть по public string вы кстати
00:13:17
знаете как можно быстро писать
00:13:20
свойства то есть можно проб написать
00:13:24
проповедь и
00:13:25
и два раза tab и он у нас создать это
00:13:28
так называемый сниппет получается полон
00:13:31
так они называются который как раз и
00:13:35
позволяет задавать вот такие вот быстрые
00:13:37
свойства string name об все создали
00:13:46
свойства
00:13:47
роб и
00:13:57
в
00:14:00
соответственно создали продукт у
00:14:02
продукта мы определили
00:14:04
имя и определили его количество а вот и
00:14:09
смотрите теперь если мы захотим создать
00:14:12
какой-то новый продукт для учета наших
00:14:20
калорий
00:14:21
да давай еще сюда добавим третий
00:14:25
параметр важны
00:14:27
проб int и что у нас там уже энергия то
00:14:36
есть количество калорий мы давайте
00:14:42
запилим конструктор public product name
00:14:58
in здесь мы пометим что должна быть
00:15:13
проверка но не будем ее сейчас писать
00:15:15
чтобы времени тратить проверка как у нас
00:15:20
делается правильно я буду верить
00:15:28
кстати очень полезная штука вот это вот
00:15:32
ту душка
00:15:33
когда вы пишете именно в таком формате
00:15:35
вы можете как бы в
00:15:40
открыть список задач и вы найдете все
00:15:44
свои ту дужки то есть комментарии в
00:15:46
таком формате то есть слышь-ка сам туда
00:15:50
двоеточие после этого комментария у нас
00:15:53
будет выведен а вот специальную панельку
00:15:55
так называемую список задач и в любой
00:15:59
момент вы сможете перейти в это место из
00:16:03
любого участка кода и там что-то себе
00:16:05
поправить очень удобная штука очень
00:16:07
рекомендую этим пользоваться вот
00:16:11
проверить входные а документы после
00:16:13
этого установить все отлично теперь мы
00:16:38
можем создавать наш продукт продукт
00:16:41
давайте три свой new product
00:16:51
яблоко так что у нас там еще было объем
00:16:58
100 грамм нет ни строковый тип и энергия
00:17:05
пусть будет 100 калорий отлично отлично
00:17:11
очень удобно очень классно но смотрите
00:17:17
вдруг случается вдруг вдруг случается
00:17:20
такая необходимость к вам приходит
00:17:23
заказчики говорит вот вася
00:17:28
все пропало наше приложение работает
00:17:32
неправильно и мы задаем только-только
00:17:38
целое значение а нам еще нужны дробные
00:17:41
значения вот вы идёте и начинаете
00:17:45
править соответственно класс вы меняете
00:17:48
тип здесь на дабл дабл дабл там поменяли
00:18:04
все более-менее отлично то есть все
00:18:08
заказчик пришел-то горькой
00:18:10
говорит что уже можно как строк с
00:18:14
дробными задавать все отлично потом
00:18:17
через две недельки приходит вам заказчик
00:18:19
говорит вася все пропало все плохо на
00:18:23
нас не устраивает то что значение с
00:18:28
плавающей запятой неправильно
00:18:30
округляются у нас там и тут сбой
00:18:33
недочеты все плохо сделать сделай нам
00:18:37
чтобы было точное количество знаков
00:18:41
после запятой вы идете в свой класс и
00:18:45
начинаете перепиливать все надеться мал
00:18:50
отлично
00:18:51
меняете меняете меняете а представьте
00:18:55
что это не такое тривиальное приложение
00:18:57
а там допустим на сто пятьсот
00:19:00
строк кода по всему разбросанно то есть
00:19:05
вот такая беда ладно потратили время
00:19:08
поменяли все отлично а потом к вам
00:19:11
приходит заказчик и говорит вася прости
00:19:16
нас грешных но нам нужно сделать так
00:19:19
чтобы в настройках пользователь
00:19:22
пользователи сами могли задавать так как
00:19:26
им нужно подсчитывать калории с дробным
00:19:29
с фиксированным только количеством
00:19:31
знаков , , или вообще без запятых
00:19:35
и вот тут вы сталкиваетесь с такой
00:19:37
проблемой что вам нужно будет создать
00:19:39
три
00:19:40
абсолютно одинаковых класса с различными
00:19:43
типами данных которые будут полностью
00:19:46
друг друга дублировать но как бы нет ни
00:19:58
проще потому что блин там берешь и
00:20:01
сталкиваешься допустим с перерасходом
00:20:04
памяти потому что детям 128-битный бит и
00:20:09
тип соответственно он будет больше
00:20:11
занимать памяти вдруг там какая-то
00:20:13
высоко-высоко нагруженная система где
00:20:16
надо обета об этом заботиться плюс
00:20:19
дополнительные какой то плюс вот этот
00:20:21
случай то что пользователь сам должен
00:20:24
что-то задавать ну это опять таки это
00:20:27
такой немножко утрированный пример
00:20:29
естественно использование шаблонов нужно
00:20:33
только там где она действительно
00:20:35
необходимо но сейчас я просто пытаюсь
00:20:37
как бы продемонстрировать
00:20:38
тот случай когда когда может быть
00:20:44
использован использованные шаблоны о
00:20:48
поэтому
00:20:51
создавать три одинаковых класса для
00:20:54
всего с одинаковой абсолютно логикой это
00:20:58
противо противоречит одной из парадигмы
00:21:06
программирования объектно ориентирована
00:21:08
а вообще есть дополнение такие парадигмы
00:21:12
программирования так называемый от драй
00:21:15
тонн intrepid и и сел не повторяйте то
00:21:19
есть писать один и тот же код три раза
00:21:21
это не оптимально это опасно потому что
00:21:24
в случае вот каких-либо обновлений
00:21:26
изменений нужно будет вносить изменение
00:21:29
в трех местах где то можно ошибиться где
00:21:32
то можно что-то пропустить наделать
00:21:34
багов а багета плохо поэтому в языке си
00:21:40
sharp присутствует вот эти вот
00:21:42
универсальные типы то есть мы на мы
00:21:45
сможем спроектировать класс таким
00:21:47
образом что вот сможем при необходимости
00:21:52
указывать тип в дальнейшем
00:21:58
соответственно что нам
00:22:00
для этого нужно для этого мы
00:22:05
соответственно при
00:22:07
при объявлении класса задаем вот как раз
00:22:13
таки имя наша нашего анонимного типа чаще
00:22:16
всего используется чаще всего
00:22:19
используется буква т но вот так вот
00:22:21
принято она пошла от слова template
00:22:26
шаблон то есть почему и зовут шаблонами
00:22:28
то есть продукты и теперь мы можем прямо
00:22:33
внутри класса здесь указать наш
00:22:38
анонимный тип вот прям таким вот образом
00:22:43
везде определить ттт и обратите внимание
00:22:50
что у нас при этом типизация остается
00:22:54
строгой то есть у нас указано что пора
00:22:59
аргумент функцию передается типа т и
00:23:02
свойство типа т и они не могут
00:23:04
отличаться то есть мы один раз задаем
00:23:07
вот этот тип для класса для конкретного
00:23:12
экземпляра класса и можем соответственно
00:23:15
быть уверены что в пределах одного
00:23:17
экземпляра класса этот анонимный тип
00:23:20
везде будет заменен на один и тот же вот
00:23:25
теперь как это использовать теперь вот
00:23:30
прошу прощение мышкой длину теперь
00:23:34
соответственно при
00:23:35
в конструкторе мы как раз таки и
00:23:38
указываем в угловых скобках тот
00:23:40
конкретный тип который нам надо то есть
00:23:43
если мы здесь указан тип int нам уже
00:23:46
сразу же сразу же идёт подстановка
00:23:49
видите то есть если мы изначально
00:23:52
наведем на класс нам пока показывает наш
00:23:58
помощник intellisense что это она не у
00:24:01
нас есть вот этот универсальный тип и
00:24:04
пока он не указан
00:24:06
и этот ти будет подставлен для второй и
00:24:09
для второго и третьего
00:24:11
аргументы конструктора в угловых скобках
00:24:13
мы указываем конкретный тип
00:24:15
и у нас тут же идет преобразование
00:24:18
нашего
00:24:19
универсального конструктора с
00:24:21
универсальным типом в конструктор везде
00:24:26
с типом int то есть нам сразу же система
00:24:29
ругается то что тип децима у нас не
00:24:32
может восприниматься как int поэтому мы
00:24:37
можем уже задавать вот так у при этом
00:24:40
рядом 2 точно такой же аргумент
00:24:43
экземпляр класса new product деться мал
00:25:00
банан уже у нас будет требовать
00:25:05
соответственно тоже чтобы это было что
00:25:18
нас было как раз таки значение с
00:25:22
фиксированной запятой то есть видите
00:25:24
bowl он уже добыл он уже не принимает мы
00:25:30
должны передавать аргумент именно на бок
00:25:33
и соответственно
00:25:35
теперь теперь к как по сути квот когда
00:25:38
сюда мы в аргумент передали какое-то
00:25:41
значение типа по сути везде внутри а
00:25:50
внутри нашего класса наш t будет заменен
00:25:54
на
00:25:57
детства по сути как представить это
00:26:01
проще всего как просто взяли кто-нибудь
00:26:04
и простой заменой
00:26:10
т-так текущий документ просто взяли и
00:26:14
вот так вот заменили так но он конечно
00:26:19
неправильно заменил потому что все буквы
00:26:22
т заменил слово целиком вот вот так вот
00:26:31
вот так вот просто взяли и заменили и
00:26:35
все вот именно так и работают наши
00:26:42
шаблоны наш
00:26:45
эти универсальные типы наше обобщения
00:26:50
как их только не называют
00:26:53
соответственно а также мы можем за
00:26:58
первое что приходит вы наверное уже
00:27:01
припоминаете такую форму записи с
00:27:04
угловыми скобками вы уже с ней
00:27:05
сталкивались то есть где она у нас
00:27:08
использовалась если помните не помнит ли
00:27:12
это у нас пески как раз таки у нее лист
00:27:23
как раз таки при создании списков мы и
00:27:27
используем наш наша
00:27:35
общение вот эти наши шаблоны вот
00:27:37
посмотрите как выглядит изнутри
00:27:41
класс списка или листа
00:27:44
если что это можно сделать очень просто
00:27:47
если вы не знали наводите мышкой на тот
00:27:51
класс который вас интересует на и
00:27:55
нажимаете клавишу f12 и вы сразу
00:27:58
переходите в реализацию этого класса
00:28:03
посмотреть конкретную то есть мы не
00:28:05
можем это стандартная реализация которая
00:28:11
входит в состав dot net framework
00:28:14
но мы можем посмотреть интерфейсы и как
00:28:17
видите здесь у нас как раз таки и
00:28:20
и является шаблоном обобщением и
00:28:23
выглядит примерно следующим образом то
00:28:27
есть лист т вот как-то так далее далее
00:28:34
что я еще хочу сказать будет ли
00:28:39
практическое занятие создания проекта
00:28:41
про по пройденному материалу да конечно
00:28:44
и даже не одно я планирую после того как
00:28:47
как мы рассмотрим синтаксис языка
00:28:52
синтаксис языка полностью потом мы будем
00:28:55
рассматривать структуры и алгоритмы и
00:28:59
поттер то есть по сути это уже какая
00:29:02
никакая практика но скажем так еще такая
00:29:06
немножко вакууме практика а после того
00:29:09
как мы уже изучим конкретно весь
00:29:11
синтаксис и все базовые структуры и
00:29:14
алгоритмы и паттерн и после этого я
00:29:16
планирую прям брать проект и с нуля на
00:29:21
стримах там в течение нескольких занятий
00:29:24
братья разрабатывать со всеми объяснениями с
00:29:28
комментариями вы тоже возможно будете
00:29:32
помогать принимать участие что-то
00:29:34
подсказывать какие-нибудь
00:29:38
накидывать темы какие-нибудь веселые
00:29:41
так что вот про это я кстати уже чуть
00:29:46
пораньше говорил видимо ты не сначала
00:29:49
подключился до практика будет практика
00:29:52
будет и просто по сишарпа
00:29:55
за уроки и просто по сишарпа и
00:30:00
соответственно по отдельным там его
00:30:04
направлением как unity я планирую
00:30:06
рассмотреть wpf winforms
00:30:12
wcf и может быть к самарин может быть но
00:30:18
я еще насчет этого не уверен да недавно
00:30:23
подключился так вот как бы немножко
00:30:28
paragon про говорили про будущее теперь
00:30:31
возвращаемся к настоящему мы можем
00:30:36
передавать ни один тип ни один тип
00:30:43
анонимные а допустила или сколько нам
00:30:47
потребуется
00:30:48
называй кстати необязательно одной
00:30:50
буквой можно как бы вполне спокойно
00:30:53
использовать и более информативные
00:30:58
названия но чаще всего вот если у нас
00:31:01
используется один то можно как раз таки
00:31:05
задавать просто буквой т так принято
00:31:09
потому что это template
00:31:12
вот и здесь соответственно если у нас
00:31:15
используется 2
00:31:18
универсальных типа мы должны и в
00:31:21
конструкторе передать 22 реальных типа
00:31:27
нет это template
00:31:29
вот такая вот фишка соответственно get
00:31:34
int int или
00:31:37
in dc mall то есть если мы зададим так
00:31:43
как видите у нас первый тип для объема
00:31:46
будет как раз кент овой а для энергии
00:31:50
будет тип decimal опять-таки все как мы
00:31:54
зададим сами для нашего класса вот а
00:32:02
если не зададим на нас соответственно
00:32:05
будет ругаться где реально используется
00:32:09
вот такая такой двойной аргумент это
00:32:12
тоже
00:32:14
new
00:32:16
dictionary словарь то есть как видите
00:32:20
здесь уже и данные более
00:32:24
более подробные имена но как видите тоже
00:32:27
начинается с буквы d type ключа тип
00:32:30
ключа шаблон включает template ключа или
00:32:35
т вылью значение кто не знает словари
00:32:38
это простая пара ключ-значение
00:32:40
ключ-значение ключ-значение
00:32:46
если они внутри самого класса все разные
00:32:50
так тебе никто не запрещает использовать
00:32:54
конкретный тип и ты хочешь если ты
00:32:59
хочешь создавать очень много вот сюда
00:33:02
вот так вот передавать сто пятьсот типов
00:33:05
это плохо это ошибка проектирования
00:33:08
значит твой класс спроектирован слишком
00:33:10
громоздко слишком неправильно такого не
00:33:15
должно быть то есть 102 максимум блин
00:33:19
три типа это три я не встречал
00:33:22
практически никогда то есть вот один два
00:33:25
типа это самая
00:33:27
top что можно задавать а если они у тебя
00:33:33
внутри класса прям все разные то блин
00:33:37
это немножко не правильно то есть ты
00:33:40
должен выделить какие-то типы которые
00:33:43
реально у тебя будут постоянно меняться
00:33:46
а если у тебя вот допустим для имени
00:33:50
видишь для имени как есть всегда стринги
00:33:53
но текстовое значение так оно всегда и
00:33:57
остается текст вам оно не меняется у нас
00:33:59
может меняться объемы энергии но больше
00:34:05
как бы нам не нужно здесь может быть еще
00:34:09
сто пятьсот каких-либо других параметров
00:34:12
но они должны быть либо
00:34:19
конкретными либо соответственно
00:34:21
использовать уже эти типы соответственно
00:34:25
тебе просто надо смотреть архитектуру
00:34:27
чтобы чтобы они бы
00:34:31
чтобы были они написаны как-то получше
00:34:33
вот итак наш словарь и nsstring и
00:34:42
соответственно он у нас map принимает
00:34:46
кайт соответственно два аргумента
00:34:49
значение пятерка строка
00:34:53
5 вот примерно таким образом при этом
00:35:00
если кошмар спасибо тебе спасибо за
00:35:07
поддержку очень приятно правда супер
00:35:10
спасибо огромное кошмар вот
00:35:19
соответственно как видите если мы здесь
00:35:22
поменяем тип string то у нас опять таки
00:35:28
количество
00:35:29
вася ты не прав здесь должна быть строка
00:35:33
и все и надо поменять настройкой тогда
00:35:36
всё заработает
00:35:37
особенность кстати мапо но его структура
00:35:41
вообще называется называют кто мапо
00:35:43
папой кто словарем в шарфе принято как
00:35:49
бы вот словарем называть соответственно
00:35:52
то что ключ вот это первое значение
00:35:54
может быть должно быть уникальным то
00:35:58
есть второй раз добавить элемент с таким
00:36:00
же значением вы не сможете вы получите
00:36:04
ошибку на этапе исполнения то есть вот
00:36:09
это вот такое вводное
00:36:13
знакомство со структурами данных об им
00:36:18
получаем то что элемент с таким ключом
00:36:20
уже существует используя слова и мы
00:36:23
гарантируем уникальность по ключу и
00:36:27
также быстро быстрый быстрое получение
00:36:32
значение вот этого по плечу
00:36:35
хорошая структура часто приходится
00:36:37
использовать возьмите на заметку
00:36:39
пригодится
00:36:41
итак возвращаемся к нашим шаблоном к
00:36:44
нашим шаблоном к нашим универсальным
00:36:46
типом что я еще хочу сказать давайте
00:36:49
вернем одинарный тип следующим образом и
00:37:04
теперь смотрите мы можем задать
00:37:08
определенные ограничения на наш шаблон
00:37:13
что это означает то есть мы можем
00:37:16
допустим у нас есть как раз таки продукт
00:37:21
и допустим сделаем класс яблоко добавить
00:37:27
класс яблоко который у нас будет у нас
00:37:35
унаследовано от продукта как видите мы
00:37:45
можем давайте пока у продуктом тогда
00:38:00
а бы нам сделать ну пусть будет вот так
00:38:03
вот так что ему не нравится а
00:38:35
модификатор доступа
00:38:36
серьезно отсутствует аргумент
00:38:50
соответствующе струю
00:38:55
продукт string а валин я конструктор
00:38:59
забыл определить твою дивизию public
00:39:36
construct the bass
00:39:45
name вот вот теперь все нормально и
00:39:56
теперь теперь обратите внимание что мы
00:40:11
можем сделать даже вот так часто меняю
00:40:25
временно для этого конкретного примера
00:40:33
так смотрите у нас есть тип яблоко
00:40:50
который унаследован от продуктом
00:41:00
скажем вот так так далее ну и для
00:41:10
примера создадим еще один класс класс по
00:41:19
но наш которые точно также будет
00:41:27
наследоваться от продукта
00:41:36
теперь он правильно создал корректно а
00:41:40
вот и теперь теперь наконец-то мы
00:41:44
создаем последний наш класс
00:41:48
пусть это будет пусть это будет прием
00:41:54
пищи то есть и getting прием пищи вот и
00:42:09
смотрите в чем основная суть чтобы
00:42:15
создать прием пищи мы должны указать как
00:42:21
раз таки наш тип наш тип
00:42:27
но но
00:42:30
и мы подразумеваем что прием пищи
00:42:32
возможен только продукта только продукта
00:42:36
но мы совершенно спокойно в нашем случае
00:42:43
можем создать вот так вот war i think
00:42:50
равно
00:42:51
и think mind вот соответственно а как
00:43:02
конкретно мы будем здесь реализует здесь
00:43:07
у нас пусть будет паблик
00:43:15
воет т.п.
00:43:32
здесь мы определяем какой нибудь
00:43:37
свойства
00:43:40
public
00:43:50
[музыка]
00:43:51
общий объем приема пищи
00:43:57
проявит и здесь мы соответственно что
00:44:02
будем делать продукт вот и у нашего вот
00:44:20
этого типа мы как раз таки хотим
00:44:24
получать наши свойства
00:44:27
наши свойства но как видите мы не можем
00:44:30
во первых мы не можем получить
00:44:35
конкретное свойство то есть мы хотим к
00:44:39
общему воли ему вот нашего свойства
00:44:44
добавить продукт .
00:44:49
вот вырвем умножить на продукт энергии
00:45:05
вот но мы не можем это сделать потому
00:45:08
что это типа
00:45:09
у нас метод расширения
00:45:13
и у нас он не может как раз таки понять
00:45:17
что это такое как с этим работать он не
00:45:22
знает о нем ничего и кроме того в чем
00:45:25
главная проблема то что мы вместо
00:45:27
продукта можем передать
00:45:29
и новый тип int о выйти и
00:45:32
система нам об этом ничего плохого нет
00:45:34
не скажет так как у нас тип вот этот
00:45:39
является универсальным соответственно и
00:45:42
любой универсальный тип мы можем сюда
00:45:45
подставить
00:45:46
но но вот для того чтобы избежать такой
00:45:50
ситуации такой ошибки проектирования
00:45:52
когда мы можем столкнуться как раз таки
00:45:55
с тем что у нас и будет вести себя не
00:46:03
нет не так как ожидалось и существует
00:46:07
ограничение то есть мы можем задавать
00:46:09
конкретные ограничения на тип т
00:46:11
здесь мы можем задать что так там у нас
00:46:17
идет ввп двоеточие
00:46:29
так и после этого указываем базовый тип
00:46:33
продукт вот и здесь мы уже как раз таки
00:46:40
получаем вот эту фишку что у нас тип т
00:46:44
теперь может быть только продуктом либо
00:46:51
любым его наследником то есть чем фишка
00:46:55
не только продукт
00:46:57
но точно так же мы можем сюда им
00:47:01
передать наше яблоко и это будет
00:47:07
корректно потому что эти облака на
00:47:08
является наследником продукта но при
00:47:12
этом строка у нас наследником продукта
00:47:16
являться не будет поэтому она его и
00:47:19
невозможно будет принять что и логично
00:47:22
мы получаем определенную защищенность мы
00:47:25
получаем доступ ко всем свойствам пара
00:47:30
пара миль с параметрами и вот то есть и
00:47:35
точно так же на самом деле мы можем
00:47:37
задавать и анонимная вот эти вот не
00:47:43
анонимные обобщенные на типы
00:47:47
и для продукта если мы здесь зададим то
00:47:52
мы можем здесь грубо говоря давайте
00:48:05
время уже немного то есть для приема
00:48:16
пищи мы зададим во первых что тип
00:48:22
продукт твоя продукт т то есть вот этот
00:48:29
тип будет прокинут в продукт и теперь мы
00:48:36
сможем задать уже продукт
00:48:44
young
00:49:03
примерно
00:49:04
вот идея ладно не будем сейчас сильно в
00:49:08
это углубляться
00:49:09
то и так уже намудрили типы в типах
00:49:14
основная суть что вам важно понимать то
00:49:19
что мы можем задавать ограничение на
00:49:23
типы какие мы можем задавать ограничение
00:49:26
на типы
00:49:29
ограничения на типы у нас как раз таки
00:49:32
следующее мы можем задавать конкретный
00:49:36
класс
00:49:40
тогда у нас будет в качестве типа
00:49:46
выступать либо ты либо его на либо
00:49:51
конкретно этот класс либо все его
00:49:54
наследники здесь может быть
00:49:56
интерфейс если у нас есть реализованный
00:50:00
интерфейс там какой-нибудь
00:50:01
и продукт или в и номер эйбл
00:50:09
вот как раз таки у нас пошло это может
00:50:15
быть интерфейс и все классы реализующие
00:50:18
этот интерфейс
00:50:20
дальше здесь может быть ключевое слово
00:50:27
труд
00:50:29
структура то есть типа может быть только
00:50:34
структура что у нас такая структура это
00:50:36
своеобразное подобие класса но немножко
00:50:39
отличающейся тем что она хранится в
00:50:41
стеке и то что она как бы немного меньше
00:50:48
не все возможности классов предоставляет
00:50:51
но при этом оно
00:50:52
имеет свои преимущества например та же
00:50:55
самая do the time это у нас является
00:50:59
структурой здесь у нас может быть
00:51:02
ключевое слово класс ключевое слово
00:51:06
класс у нас говорит о том что тип
00:51:09
обязательно должен быть классом то есть
00:51:11
это не структуру нас есть разграничение
00:51:13
вот с помощью этих ключевых слов либо
00:51:16
класс либо структура мы определяем либо
00:51:20
то либо то и еще одно ограничение
00:51:24
которое может быть у нас выглядит вот
00:51:28
так вот new и скобочки это означает что
00:51:32
у класса должен быть публичный
00:51:36
конструктор без параметров то есть у вот
00:51:41
в данном случае наш продукт не подойдет
00:51:48
на самом деле почему ну вот допустим вот
00:51:55
эти облака если мы захотим сюда передать
00:51:59
apple
00:52:01
он нам не подойдет потому что у яблока
00:52:07
нету конструкторы без параметров если мы
00:52:10
добавим конструктор публичный без
00:52:13
параметров вот такой он у нас
00:52:20
нравится доступным но при этом банан у
00:52:27
которого нет такого конструктора
00:52:29
остается недоступным вот такие
00:52:32
ограничения соответственно ограничение
00:52:35
задается с помощью ключевого слова в и
00:52:39
соответственно указанием либо
00:52:41
конкретного класса но чаще всего все
00:52:44
таки используют класс
00:52:46
то есть это у нас будет скорее всего вот
00:52:52
так так что осталось мне сказать по этой
00:52:58
теме и что если у нас несколько
00:53:00
параметров
00:53:01
у нас может быть несколько пвт nevian
00:53:11
пусть будет что у нас какой-нибудь айну
00:53:27
мира apple
00:53:28
а пусть вот так то есть мы для первого
00:53:31
типа задали ограничения то что должен
00:53:34
быть продукт или наследник для второго
00:53:37
типа и номере был или класса и
00:53:41
реализующий этот интерфейс
00:53:44
соответственно здесь мы уже сможем
00:53:48
передать допустим лист и вот так вот то
00:53:58
есть у нас лист реализует интерфейс а и номере был
00:54:02
поэтому мы можем его сюда передать но
00:54:04
при этом сюда тот же самый продукт не
00:54:09
можем передать не судьба не получается
00:54:16
так и теперь наверное самое последнее
00:54:19
что хочу
00:54:21
сказать это ключевое слово default то
00:54:25
есть смотрите нам мы часто сталкиваемся
00:54:28
с такой необходимостью как установка
00:54:31
значение по умолчанию то есть если у нас
00:54:37
продукт будет типизированный вот
00:54:44
допустим так так и допустим мы захотим
00:54:54
не так устанавливать допустим а energy
00:54:57
который у нас типа тед тоже
00:55:00
мы захотим установить значением по
00:55:03
умолчанию но мы не знаем каким конкретно
00:55:06
его устанавливать то есть мы можем
00:55:07
попробовать на свой страх и риск
00:55:10
установить на но здесь как раз так мы
00:55:13
сталкиваемся с тем что так нельзя делать
00:55:16
то есть в int мы не можем присвоить нал
00:55:21
int и при свой канал у нас это не нулей
00:55:24
был тип поэтому мы не можем выполнить
00:55:27
так такую операцию а как нам узнать у
00:55:30
шаблона какой будет конкретный тип а нам
00:55:33
сама среда разработки пока подсказывай
00:55:35
что мы должны использовать ключевое
00:55:37
слово
00:55:40
faut т и сюда будет установлено значение
00:55:44
по умолчанию для энтого допустим это
00:55:48
будет 0 для строке и по моему пустая
00:55:52
строка для класса это будет на а вот в
00:55:56
таком плане поэтому
00:56:00
именно так у нас и будет работать вот
00:56:04
это значение по умолчанию тотчас я
00:56:08
проверю все ли я рассказал если у вас
00:56:13
есть какие то вопросы вы можете сейчас
00:56:15
их написать я постараюсь вам ответить и
00:56:19
после этого я как раз таки
00:56:20
напишу домашние задания да и кстати что
00:56:33
еще забыл упомянуть то что у нас
00:56:39
обобщенный тип может и возвращаться то
00:56:42
есть совершенно спокойно в качестве
00:56:44
возвращаемого аргумента метода мы можем
00:56:48
использовать нашу анонимный тип return
00:56:56
дефолт вот так допустим и в таком случае
00:57:01
у нас как раз таки и будет все прекрасно
00:57:05
работать то есть если в данном случае мы
00:57:10
зададим какой-то конкретный тип тета у
00:57:13
нас будет возвращаться именно конкретно
00:57:15
и это значение конкретного этого типа
00:57:19
который мы создадим на этапе вызова
00:57:23
скажем так так вот надо будет немножко
00:57:29
поправить перед тем как выкладывать на
00:57:31
git хоп чтобы тут совсем не какая-то
00:57:33
дичь было поэтому сегодня я скорее всего
00:57:36
выложу и тогда уже при необходимости
00:57:42
посмотрите
00:57:44
вот домашнее задание домашнее задание
00:57:55
так что мы делаем нужно в вашей 3d нет
00:58:03
моментом власти и делить не вверх
00:58:14
базовый класс и несколько лет до у вас
00:58:39
добавить в
00:58:42
[музыка]
00:58:46
давайте так добавить только базовый
00:58:52
класс ну давайте поправим универсальный
00:59:01
тип создать класс который будет создать
00:59:26
класс к который будет принимать
00:59:31
качестве не
00:59:37
социального типа качестве универсальной
00:59:42
типа базовый класс
00:59:45
но как раз таки то что мы сегодня делали
00:59:51
да и соответственно по перерыва ют с что
01:00:15
я от вас хочу я хочу чтобы вы к краске
01:00:18
взяли и своими руками попробовали
01:00:21
реализовать
01:00:22
примерно то что я показывал вам сегодня
01:00:26
на занятии то есть вы должны определить
01:00:30
класс
01:00:31
правда продукт универсальный потом у нас
01:00:43
должен быть какой-то класс который будет
01:00:46
его использовать и какой
01:00:51
будет его как раз таки принимать
01:00:54
сохранить в качестве ограничения и
01:00:56
дальше его соответственно нужно будет
01:01:01
про использовать про использовать какое
01:01:04
интересное блин слова придумал про
01:01:13
использовать внутри спс
01:01:15
уже при вызове вот примерно такая задача
01:01:18
я вижу что сегодня вопросов как бы нету
01:01:23
поэтому будем завершать
01:01:25
всем большое спасибо за то что были на
01:01:30
занятие пожалуйста поставьте like под
01:01:33
видео потому что это действительно
01:01:35
полезно для продвижения для привлечения
01:01:39
новых людей также не забывайте что есть
01:01:45
ссылки на группу вконтакте и на другие
01:01:48
мои ресурсы там telegram цен сайт
01:01:51
у меня на самом деле много всего поэтому
01:01:55
подписывайтесь и не пропускайте занятия
01:01:59
учитесь и шар пробуйте пробуйте все
01:02:02
обязательно на практике это очень важно
01:02:05
то есть то что я вам рассказал это
01:02:07
только вот самое начало процесса
01:02:10
обучения поэтому обязательно все нужно
01:02:14
пробовать своими руками обязательно
01:02:16
писать только так вы чему-то хорошему
01:02:19
научитесь а всех жду на следующем
01:02:22
занятии в этот четверг
01:02:25
буду очень рад если вы присоединитесь
01:02:29
все всем большое спасибо и всем пока

Описание:

Обобщения или шаблоны (Generic) в языке программирования C# На этом занятии мы рассмотрим Универсальные шаблоны в языке программирования C#. Также часто встречаются названия обобщения, дженерики или generics. Они позволяют определять так называемые универсальные типы данных, которые позволяют динамически определять тип, при этом оставаясь языком со строгой типизацией. ----------- ПОДПИШИСЬ на соцсети: 🔴 TELEGRAM: https://ttttt.me/joinchat/AAAAAEOzZfpJvCkPaOyurA 🔴 VK: https://bit.ly/vk_codeblog 🔴 INSTAGRAM: https://www.facebook.com/unsupportedbrowser 🔴 Яндекс Дзен: https://dzen.ru/codeblog 🔴 FACEBOOK: https://www.facebook.com/unsupportedbrowser 🔴 TWITTER: http://bit.ly/twit_codeblog 🔴 Мой блог: https://bit.ly/site_codeblog ----------- ПОДДЕРЖИ развитие CODE BLOG: 💲 Донат: https://www.donationalerts.com/r/shwanoff 💲 Спонсорство: https://www.patreon.com/codeblog ----------- СМОТРИ мои обучающие курсы: 👉 УЧИМ ШАРП: https://www.youtube.com/watch?v=p9QxqrwkPbA&list=PLIIXgDT0bKw4OmiZ9yGmShKsY0XncViZ8 👉 ПРАКТИЧЕСКИЙ ИНТЕНСИВ #1: https://www.youtube.com/watch?v=eQph6ZT4X5w&list=PLIIXgDT0bKw7AOFNyc2_FGYDj_52AclvV 👉 ПРАКТИЧЕСКИЙ ИНТЕНСИВ #2: https://www.youtube.com/watch?v=XHuUN1u8ZPE&list=PLIIXgDT0bKw4M1_5JX0LRHdjQXSR0Upfw 👉 СТРУКТУРЫ ДАННЫХ: https://www.youtube.com/watch?v=hZYQmNJBsKM&list=PLIIXgDT0bKw4DB9toGU73ntyYIZV7aJi5 👉 АЛГОРИТМЫ СОРТИРОВКИ: https://www.youtube.com/watch?v=PD1Nn4fHcts&list=PLIIXgDT0bKw4n6pwBjymd3wCPyQ3_SLMo 👉 ОТВЕТЫ НА ВОПРОСЫ: https://www.youtube.com/watch?v=Xb1prk0to9I&list=PLIIXgDT0bKw7oKRr2c1n-e_dUgR8Aqdsi 👉 IT ПЕРЕОЗВУЧКА: https://www.youtube.com/watch?v=Q1VAd1xUtxI&list=PLIIXgDT0bKw5O-kShBcWT0bk7Ev8lZYmV 👉 НЕЙРОННАЯ СЕТЬ: https://www.youtube.com/watch?v=woohvQE73AI&list=PLIIXgDT0bKw7VnfMl5wWW_kjmmCrHjfvb 👉 ПАТТЕРНЫ ПРОЕКТИРОВАНИЯ: https://www.youtube.com/watch?v=RsU2K5Cuu_U&list=PLIIXgDT0bKw5gOlwxV1TigVAeOPhR6kes 👉 CODE REVIEW: https://www.youtube.com/watch?v=hhYZEts63rQ&list=PLIIXgDT0bKw6FSCulrNWzWMRf0cH0fz0_ 👉 CLR via C#: https://www.youtube.com/watch?v=m_nvUAXdbOY&list=PLIIXgDT0bKw6i4jQkHVgIrnsP-DcvBieq ----------- Кстати, меня зовут Шванов Вадим, и я профессиональный .NET разработчик с 2011 года и автор этого канала CODE BLOG. Я рассказываю про IT технологии и веду абсолютно бесплатный курс по языку C# с нуля. В его рамках мы рассмотрим как базовый синтаксис языка C Sharp, так и его практическое применение и специальные технологии, такие как ASP .NET, .NET Core, ASP.NET MVC, Unity, WPF, структуры данных и алгоритмы, с#, dotnet, паттерны проектирования, информатика, csharp, программное обеспечение и многое другое. Для меня важно не только показать практическое применение языка си шарп, но и объяснить основную идею и базовые понятия Computer Science. В качестве основного инструмента разработки используется Visual Studio c# и проекты на Visual c#. Если вам нравятся такие каналы как хауди хо, айти борода, Soer или ExtremeCode, то здесь вам точно понравится. -----------

Готовим варианты загрузки

popular icon
Популярные
hd icon
HD видео
audio icon
Только звук
total icon
Все форматы
* — Если видео проигрывается в новой вкладке, перейдите в неё, а затем кликните по видео правой кнопкой мыши и выберите пункт "Сохранить видео как..."
** — Ссылка предназначенная для онлайн воспроизведения в специализированных плеерах

Вопросы о скачивании видео

mobile menu iconКак можно скачать видео "Обобщения или шаблоны (Generic) в C# - Учим Шарп #12"?mobile menu icon

  • Сайт http://unidownloader.com/ — лучший способ скачать видео или отдельно аудиодорожку, если хочется обойтись без установки программ и расширений. Расширение UDL Helper — удобная кнопка, которая органично встраивается на сайты YouTube, Instagram и OK.ru для быстрого скачивания контента.

  • Программа UDL Client (для Windows) — самое мощное решение, поддерживающее более 900 сайтов, социальных сетей и видеохостингов, а также любое качество видео, которое доступно в источнике.

  • UDL Lite — представляет собой удобный доступ к сайту с мобильного устройства. С его помощью вы можете легко скачивать видео прямо на смартфон.

mobile menu iconКакой формат видео "Обобщения или шаблоны (Generic) в C# - Учим Шарп #12" выбрать?mobile menu icon

  • Наилучшее качество имеют форматы FullHD (1080p), 2K (1440p), 4K (2160p) и 8K (4320p). Чем больше разрешение вашего экрана, тем выше должно быть качество видео. Однако следует учесть и другие факторы: скорость скачивания, количество свободного места, а также производительность устройства при воспроизведении.

mobile menu iconПочему компьютер зависает при загрузке видео "Обобщения или шаблоны (Generic) в C# - Учим Шарп #12"?mobile menu icon

  • Полностью зависать браузер/компьютер не должен! Если это произошло, просьба сообщить об этом, указав ссылку на видео. Иногда видео нельзя скачать напрямую в подходящем формате, поэтому мы добавили возможность конвертации файла в нужный формат. В отдельных случаях этот процесс может активно использовать ресурсы компьютера.

mobile menu iconКак скачать видео "Обобщения или шаблоны (Generic) в C# - Учим Шарп #12" на телефон?mobile menu icon

  • Вы можете скачать видео на свой смартфон с помощью сайта или pwa-приложения UDL Lite. Также есть возможность отправить ссылку на скачивание через QR-код с помощью расширения UDL Helper.

mobile menu iconКак скачать аудиодорожку (музыку) в MP3 "Обобщения или шаблоны (Generic) в C# - Учим Шарп #12"?mobile menu icon

  • Самый удобный способ — воспользоваться программой UDL Client, которая поддерживает конвертацию видео в формат MP3. В некоторых случаях MP3 можно скачать и через расширение UDL Helper.

mobile menu iconКак сохранить кадр из видео "Обобщения или шаблоны (Generic) в C# - Учим Шарп #12"?mobile menu icon

  • Эта функция доступна в расширении UDL Helper. Убедитесь, что в настройках отмечен пункт «Отображать кнопку сохранения скриншота из видео». В правом нижнем углу плеера левее иконки «Настройки» должна появиться иконка камеры, по нажатию на которую текущий кадр из видео будет сохранён на ваш компьютер в формате JPEG.

mobile menu iconСколько это всё стоит?mobile menu icon

  • Нисколько. Наши сервисы абсолютно бесплатны для всех пользователей. Здесь нет PRO подписок, нет ограничений на количество или максимальную длину скачиваемого видео.