На этом занятии мы рассмотрим Универсальные шаблоны в языке программирования C#. Также часто встречаются названия обобщения, дженерики или generics. Они позволяют определять так называемые универсальные типы данных, которые позволяют динамически определять тип, при этом оставаясь языком со строгой типизацией. 5:20 Начало. Что такое шаблоны (универсальные типы, дженерики, обобщения) в C# 13:00 Создание базовых классов проекта 17:18 Разъяснение, в каких случаях лучше всего использовать универсальные типы 22:00 Создание и использование класса с обобщенным типом 28:35 Планы на курс Учим Шарп 30:35 Множественные универсальные типы C# 37:05 Ограничения generics 49:20 Какие могут быть ограничения обобщенного типа (class, interface, struct, new()) 54:25 Значение по умолчанию default(T) 57:45 Домашнее задание
@Yury93-b8n4 жыл бұрын
CODE BLOG - Программирование и C# здравствуйте) юнити уже не актуально?)
@NaNaNaS_0002 жыл бұрын
@@Yury93-b8n почему вы так думаете?
@Yury93-b8n2 жыл бұрын
@@NaNaNaS_000 Вадим говорил, что юнити тоже рассмотрит) вот я и спросил
@NaNaNaS_0002 жыл бұрын
@@Yury93-b8n ясно. А программирование под Unity сейчас актуально
@ruslanrasengan36643 жыл бұрын
05:24 - начало 14:21 - фича с Property 15:15 - фича с // TODO: some description 26:50 - обзор класса List 32:00 - обзор дженерика с двумя аргументами, пример Dictionary 49:30 - ограничения на типы 54:00 - ключевое слово default
@YTsyvinda5 жыл бұрын
Спасибо! Обобщение - это переменная для типа. Это самое простое и понятное определение которое мне попалось
@CODEBLOG5 жыл бұрын
Не совсем точное, но действительно помогает понять на начальном уровне )
@ghjcnjxtkjdtr8874 жыл бұрын
На первом уроке 150к просмотров, 12 урок - 17к... Как же быстро отсеиваются будущие конкуренты :)
@LimanOff123 жыл бұрын
@@Udjduddhe а лучше закреплять практикой
@slavaukharikkim48332 жыл бұрын
Привет! Как результаты?
@slavaukharikkim48332 жыл бұрын
Привет. Как результаты?
@TheArtzlo2 жыл бұрын
конкуренты)))Это мышление людей не из IT. Когда заберешься достаточно глубоко , будешь рад что кто-то есть добравшийся чтобы обсудить. А данные видео будешь пересматривать для освежения знаний. В первую очередь практика практика и практика. Простого пути в IT не бывает.
@sunday97972 жыл бұрын
@@TheArtzlo Согласен на все 100%
@paphnooteyyoba80663 жыл бұрын
Очень толково и доходчиво обьясняешь. Спасибо добрый человек, здоровья тебе и хорошей женщины.
@SergeyKirik2 жыл бұрын
Вадим, спасибо большое за доходчивое пояснение. Пример то что надо, как раз позволил понять зачем в принципе нужны эти обобщения (как для начинающего).
@Вячеслав-р1х7ж4 жыл бұрын
Дружище..ты супер... спасибо...за труд...
@matrix-u1n5 жыл бұрын
Спасибо,благодаря тебе понял делегаты,и это понял.Хотя не раз хватался за голову и откладывал разбор на потом
@НикитаОнищенко-ц4б5 жыл бұрын
После 40-й минуты ничего не понятно,но очень интересно)))
@CODEBLOG5 жыл бұрын
А что именно не понятно?
@НикитаОнищенко-ц4б5 жыл бұрын
@@CODEBLOG Трудно сказать...Я скажем так совсем новичек.И если что-то усложняется то теряю нить темы....
@Filkio4 жыл бұрын
комменты напугали, но всё абсолютно доходчиво объяснено было) единственное что: с интерфейсами и структурами пока не знаком. в следующих уроках познакомлюсь) спасибо за уроки!
@valeriy7864 жыл бұрын
Еще раз большое спасибо за уроки!
@cartoonshow2724 жыл бұрын
Отличный видео урок! Спасибо!
@OpalGooDog3 жыл бұрын
Спасибо большое) Благодаря вам мой код лучше. А я больше знаю.
@archivfan4 жыл бұрын
Спасибо отличный урок, всё понятно и по полкам...
@juliusmalkov96206 жыл бұрын
честно не смотрел предыдущие видео ибо знаю азы, а это решил просто повторить, но блин я не знал ни прo TODO , ни про F12 что бы посмотреть структуру класса (List в данном случае ), а можно ли видео отдельное про фичи VS?)
@CODEBLOG6 жыл бұрын
Будет )
@bigdeiron35884 жыл бұрын
Спасибо Вам огромное!!!
@Foxy2002-s3l Жыл бұрын
Смотрю видео в конце 23 года)) пойду сейчас реализовывать класс с универсальным типом, в своем пет проекте) контент ох...й
@pavelsukhina72095 жыл бұрын
Крутой дядька
@CODEBLOG5 жыл бұрын
Спасибо )
@CODEBLOG5 жыл бұрын
Но вот дядька... прямо старичком себя чувствую )))
@sashkosashok6 жыл бұрын
Мне все понятно. Но потому, что я нормально так кодил на Java, есть знакомство с подобными вещами и я знаю, например, зачем используют интерфейсы. А так, интерфейсы пойдут следующими лекциями судя по плейлисту, а Template в лекции уже ограничивает интерфейс Enumerable. Непорядок)
@vladoss46432 жыл бұрын
А у меня компилятор ругается на запись: class Eating where T: Product . Видимо, потому что он считает, что тип Т - предается внутрь класса Product тоже. Но если написать: class Eating where T: Product - то он пишет, что не может найти пространство имен TT. И работает, только если писать так: class Eating where T: Product - например. А почему?
@GoLezhaShowMega3 жыл бұрын
А где на гидхабе можно найти ?
@Jarzykk4 жыл бұрын
Спасибо!
@urbans64 жыл бұрын
сначала лайк, потом запускаю видео)
@DeadRabbitCanDance4 жыл бұрын
26:30 А если нужно чтобы было два или три разных заменяемых типа в классе? Такое можно сделать? не один а два ? public class TestClass { public T1 Item1{get; set;} public T2 Item2{get; set;} }
@NeizBest4 жыл бұрын
Может быть, вы что-то не так поняли? Там же можно сколько угодно T перечислять, просто через запятую. Впрочем, вы уже должны были увидеть ответ в видео, так что непонятно, как вообще этот вопрос остался.
@ruslanpidhainyi975710 ай бұрын
Так, взагалі я бачив цей приклад який ти подав
@vitaly71964 жыл бұрын
Все хорошо, но на 49 минуте уже пошла каша, много намешано лучше немного потривиальней но лаконичней чем так усложнять. Есть возможность сделать сессию по Restsharp?
@PuishImov4 жыл бұрын
Я только одного не понял, что получается когда в Eating передаётся базовый класс Products? Когда передовался int было понятно что все T будут иметь свойство T но что получается когда передаётся Products?
@OnikMod4 жыл бұрын
Аналогичный вопрос.
@МихаилМатвеенко-н5е3 жыл бұрын
Мы передаём Products, чтобы при создании экземпляра класса Eating мы могли бы указать любой из наследников Products (Apple или Banana). Это всё надо, чтобы потом мы могли вызвать метод Add и посчитать Volume. Предварительно создав экземпляр наследника. Просто раньше мы метод указывали в родительском классе и после вызывали у наследников, а сейчас мы под метод создали отдельный новый класс.
@VakulaEugen4 жыл бұрын
Рассмотрение Unity и WPF все еще в планах, или уже нет((?
@raiver62064 жыл бұрын
+, хочется юнити...
@NeizBest4 жыл бұрын
Да. Стало сложнее, чем раньше. Но менее интересно от этого не стало))) (Только , похоже, пора уже печатать свою версию, чтобы толком разобраться в том, что здесь происходит)))
@axsuam5 жыл бұрын
Спасибо.
@Sergioshe4 жыл бұрын
Спасибо
@AN-ts4rf4 жыл бұрын
вы эти примеры на гитхаб загружаете? если да то как их найти?
@CODEBLOG4 жыл бұрын
Да, все примеры я публикую на GitHub: github.com/shwanoff
@tandinio5 жыл бұрын
Вадим, а как быть, если присвоил универсальный тип параметру (массе, например), а затем хочешь проверку написать? Компилятор говорит, что нельзя преобразовать в T Вот код: public abstract class Product { public string Name { get; set; } public T Price { get; set; } public T Volume { get; set; } public Product (string name, T price, T volume) { if (string.IsNullOrWhiteSpace(name)) { throw new ArgumentNullException($"Имя товара не может быть пустым!"); } if (price < 0) //ошибка { throw new ArgumentNullException($"Цена не может быть отрицательной"); } if (volume
@CODEBLOG5 жыл бұрын
рядом вроде бы был такой же вопрос ) как компилятор будет сравнивать число 0 с типом T? Т может быть и числом, и строкой, и человеком, и крокодилом. как сравнить число и крокодила? ) поэтому нужно сделать приведение перед такой проверкой
@NickM4195-o4l4 жыл бұрын
Привести можно таким методом: Convert.ToInt32()
@ret13dino4 жыл бұрын
@@NickM4195-o4l А где именно нужно проводить приведение??????
@crazygloom13912 жыл бұрын
@@ret13dino Приветствую, подскажите нашли решение?
@amir_ibragimov2 жыл бұрын
@@crazygloom1391 написали же, делать приведение
@Dhu43bdudhsnqdjfi4836 жыл бұрын
Есть ли возможность указание дефолтного значения для generic? Типа class Foo where TBar = int ? P.S. Этот код у меня не компилится
@CODEBLOG6 жыл бұрын
Нет, такого я точно не встречал )
@stendykng3506 жыл бұрын
можно указать структуру или же при наследовании от другого обобщенного типа указать явно его тип, который собственно будет присвоен классу-потомку
@victoriacare61565 жыл бұрын
Привет! Как найти на githab исходный код HELP!!!!
@CODEBLOG5 жыл бұрын
Ну вообще есть ссылка в описании канала, а так вот github.com/shwanoff/Lesson12
@victoriacare61565 жыл бұрын
@@CODEBLOG Спасибо)
@kromarty4 жыл бұрын
А как можно например собственную шаблонную функцию минимума сделать, чтобы он мог сравнивать тип T друг с другом?
@Fikusiklol2 жыл бұрын
Привет. 47:07 1. Какой смысл указывать generic у класса Eating метода Add, если ВСЕ поля Product у Product? Какой смысл скармливать наследников, если там новых полей нет. в данном случае абсолютно бесполезно и можно убрать. 2. Аргументом передаются интерфейсы, где уже любой класс, который реализует его, может быть передан аргументом. В том числе и его наследники. 3. В данном случае, если у тебя у любого наследника появится новое поле, то ты уже его использовать в этом методе не сможешь, даже с учетом, что там Product. У Product просто нет доступа туда. 4. В итоге ты полностью отошел от концепции того, что именно продакт должен содержать generic, нарушив несколько принципов ООП. Очень запутанно и непонятно обьяснил. В любом случае лайк, но к таким достаточно "мутным" темам лучше все таки готовить материал заранее. С 47 по 51 минуту смотрелось как уж на сковородке. Ничего личного.
@Денис-у1и4я4 жыл бұрын
Не уловил про ограничения. Зачем нам ограничивать по другому классу допустим, если ЭТОТ КОД: public class Calculation where T: Sphere { public void Calc(T figure) { figure.Total = figure.Radius * figure.Volume; } } И ЭТОТ КОД: public class Calculation { public void Calc(Sphere figure) { figure.Total = figure.Radius * figure.Volume; } } Идентичны по сути Я бы понял, если бы наследники класса , который является ограничителем ( здесь Sphere), тоже являлись ограничителем, но это же не так. Класс Sphere наследуется от класса Figure . Если написать public class Calculation where T: Figure, тогда в методе Calc произойдет ошибка и выдаст , что Т не содержит определения .Radius и .Volume. P.S. .Radius и .Volume - свойства класса Sphere P.S.S. Calculation where T: Sphere так нельзя написать, выдает ошибку. Calculation where T: Sphere и так нельзя тоже . Нужно явно указывать тип у Sphere,если класс Sphere в принципе имеет универсальный тип. И уже из этого выходит вопрос выше с 2 примерами кода
@paveldukov6 жыл бұрын
спасибо
@nowar83794 жыл бұрын
Только при проверке входных параметров,ошибки летят,при применении Т
@Sozvic5 жыл бұрын
А можно видео про автоматизацию на C# или про MVC &
@CODEBLOG5 жыл бұрын
Про MVC Точно будет. А что именно про автоматизацию интересует?
@Dhu43bdudhsnqdjfi4836 жыл бұрын
Какой класс описывает стандартные типы, чтобы принимать только int, string, а не какие-либо кастомные классы?
@CODEBLOG6 жыл бұрын
Конкретно для базовых типов нет, но можно использовать where T:struct. Это позволит использовать все структуры, а именно к ним относятся базовые типы (int, double, DateTIme и другие), а классы соответственно использовать будет нельзя. Но можно создавать свои структуры, поэтому это не 100% защита
@JustPlayingBroGD6 жыл бұрын
А на практике в каких случаях удобно применять дженерики? В каких случаях и для чего их применяют чаще всего?
@Dhu43bdudhsnqdjfi4836 жыл бұрын
Удобно в случае использования адаптера. Ты используешь свой класс для нескольких возможных. К примеру, в unity мне нужно было описать кастомный метод поиска объектов по тому привязан ли к объекту определенный тип public IEnumerable Find() where T : MyObject. Это примерно вид метода. Очень удобно
@CODEBLOG6 жыл бұрын
На практике универсальные типы чаще всего используются, при работе с коллекциями. Это прямо №1. Далее они нужны для создания универсальных функций, когда нам нужно выполнять одинаковые действия над различными типами данных или хотим сохранить объект, но пока не знаем какой именно тип у него будет. На самом деле это достаточно скользкая дорожка, злоупотреблять шаблонами не нужно. если есть возможность обойтись без них - то лучше без них ))
@JustPlayingBroGD6 жыл бұрын
@@Dhu43bdudhsnqdjfi483 Спасибо )
@JustPlayingBroGD6 жыл бұрын
@@CODEBLOG Благодарю )
@caskol57046 жыл бұрын
Ближе к концу стало вообще не понятно, что тут происходит)
@vladkorsak21634 жыл бұрын
наверно сейчас это уже детский лепет для вас?))
@pssp44504 жыл бұрын
@@vladkorsak2163 первый раз был типа "чёёёё?" но после второго просмотра всё стало на ~85% понятнее.
@muslimurudzhaliev60535 жыл бұрын
что значить в вашей предметной области?
@minoddein72055 жыл бұрын
Дальше проходятся регулярные выражения?
@CODEBLOG5 жыл бұрын
Нет, пока еще не снимал, но есть в планах
@stillshade60645 жыл бұрын
Дошел я до этого урока и мне уже страшно... Только я один вообще ничего не понимаю в программировании или ещё кто-то есть?) Это вообще пройдет или уже и не стоит дальше пытаться понять?)
@CODEBLOG5 жыл бұрын
А что именно не понятно? возможно нужно попробовать на практике поделать что-нибудь, хоть как-нибудь. Когда начинаешь пробовать руками понимание приходит быстрее
@stillshade60645 жыл бұрын
@@CODEBLOG я, скорее всего, если так правильно говорить, не понимаю архитектуру построения кода... Видимо мало времени ещё прошло) Ну и мне С# для Unity нужен, а там свои нюансы есть.
@1pampers13aby74 жыл бұрын
Тут через БоОль НеПонимания! Там 30% теории и 70% практики. И из этих 70% в большей степени ты сидишь и пытаешься вникнуть/ понять(методом тыка), сидишь тупишь. Но все таки это дает свои плоды, пусть даже урожай не велик
@vallJune5 жыл бұрын
Ковариантность и контрвариантность хотелось бы
@CODEBLOG5 жыл бұрын
Думаю в будущем записать отдельное подробное видео с кучей примеров на эту тему
@eugenekrutoy14754 жыл бұрын
Я немного не понял, ограничение на конструктор без параметров, но насколько я знаю, если в классе нет конструктора, компилятор автоматом создает конструктор без параметров. Не понимаю, т. к новичок, то есть он явно должен быть объявлен? Если да, то появляется вопрос, а нахрен это вообще нужно. Извините за, возможно, глупый вопрос🙂
@viktarvarabei60793 жыл бұрын
Если в классе объявлен конструктор с параметрами, то конструктор без параметров нам надо объявлять явно, если в классе конструктора никакого нет, то конструктор без параметров объявляется неявно(мб кому пригодится)
@user-io9iq2di4w Жыл бұрын
А вот и первые трудности, после ключевого слова where мозг уже поплыл
@atler98654 жыл бұрын
Еще проще перейти в реализацию класса если нажать Ctrl + LKM по классу на который хотите перейти
@atler98654 жыл бұрын
P.S. Уроки топ. Надеюсь позже будут интенсивы по созданию сайта, сервиса или чего подобного на разных технологиях (AWS, .NET core, ASP.NET core, и тд)
@denismetak53902 жыл бұрын
После этих курсов, я сразу нашёл работу на галере за 100500 тыщ
@vallJune5 жыл бұрын
T пошло от Type по крайней мере это у Рихтера
@CODEBLOG5 жыл бұрын
Да, а у MSDN их обобщенными шаблонами тоже называют, поэтому точно узнать не получится ) но это не так принципиально важно )
@fillmike3 жыл бұрын
топ
@Вячеслав-р1х7ж4 жыл бұрын
Народ, подкиньте тему для домашки? У кого какие мысли.
@DeadRabbitCanDance4 жыл бұрын
тут соответсвенно мы можем .... ммм... а блин, тут конструктор я забыл определить. Набираем 5 минут непонятно что. а блин это мы сотрем в этом случае... а мммм а тут обратите внимание что мммм...м ммм... мм это я удалю. это мы можем сделать даже вот так вот. сейчас поменяем конкретно для этого примера, удаляем всё что относится к темплейту. делаем уже наследование от класса без темплейта, потому что почему то не смогли записать синтаксис наследования от класса с темплейтом и ничего не понятно. вот. и теперь. теперь наконец то... мммм... эээ.... В итоге полная каша и ничего не понятно. Смотрел три раза и ничего не понял. Код в итоге подчеркнут интелисенсом как некорректный... Ладно, не будем сейчас в это углубляться. И так уже намудрили.... Что такое интерфейс? Про него ничего не было сказано! Как сделать ограничение, что тип может быть int или float или decimal, но не может быть double ? Наверно хорошо бы перед созданием нового класса сначала сказать что он ДОЛЖЕН делать, а потом как мы это реализовываем.
@Dhu43bdudhsnqdjfi4836 жыл бұрын
Зачем использовать dictionary, когда есть class? Все-таки class меньше весит. Да и если используешь dict, то практически в 80% случаев все равно знаешь какие поля будут заданы?
@CODEBLOG6 жыл бұрын
Видимо ты не совсем правильно понял, что такое словарь. его можно себе представить как список, но кроме самого значения у тебя есть и ключ, по которому можно быстро получить значение. Пример использования словаря, ключ - логин пользователя, значения - все данные о пользователе в системе. При авторизации по логину, можешь получить все данные конкретного пользователя. при этом ты автоматически будешь контролировать, чтобы второго пользователя с таким логином не было. Да, это можно написать вручную своим классом, но зачем изобретать велосипед, если есть готовая надежная реализация? )
@xSPESHERx Жыл бұрын
Автор, вернись пожалуйста. 😢
@someonewhoyoudontknowiguess6 жыл бұрын
Что то я не понял где свободное общение...
@igorcoolman4 жыл бұрын
не до конца объяснил и продемонстрировал работу ограничений
@KirillCheremisin4 жыл бұрын
блэд, он все это время смотрел в другую сторону!)
@spaicyworld91134 жыл бұрын
я запушу вижуалку а вы пока *включается реклама*
@callpack965 жыл бұрын
димуня был здесь
@CODEBLOG5 жыл бұрын
Привет, димуне :)
@Dhu43bdudhsnqdjfi4836 жыл бұрын
T - сокращение от type
@CODEBLOG6 жыл бұрын
Разные источники говорят по разному. Я находил и Type, и Template. Но суть от этого не сильно меняется
@stendykng3506 жыл бұрын
По сути это просто общепризнанный вид записи, а так ты можешь тулить что угодно вместо T, лишь бы не было пересечения с другими типами.
@ivanomelchenko18954 жыл бұрын
+++
@mechanism-o4h2 жыл бұрын
Ну такое... рассказывать тему и не разбираться банально в синтаксисе, чтобы потом съехать, мол "это не важно". Интересно, как те, кто обучается, из этого урока должны вообще чему-то научиться для меня загадка, если честно. Думаю, что на собеседовании такой ответ точно не прокатит.
@ПавелСоболев-л5ц2 жыл бұрын
Спасибо
@benya43965 жыл бұрын
Вадим, а как быть, если присвоил универсальный тип параметру (массе, например), а затем хочешь проверку написать? Компилятор говорит, что нельзя преобразовать в T Вот код: public abstract class Product { public string Name { get; set; } public T Price { get; set; } public T Volume { get; set; } public Product (string name, T price, T volume) { if (string.IsNullOrWhiteSpace(name)) { throw new ArgumentNullException($"Имя товара не может быть пустым!"); } if (price < 0) //ошибка { throw new ArgumentNullException($"Цена не может быть отрицательной"); } if (volume
@CODEBLOG5 жыл бұрын
естественно он не может так проверить. на месте T может быть абсолютно любой тип, и как компилятору сравнивать с числом 0 например крокодила )))
@benya43965 жыл бұрын
@@CODEBLOG Спасибо за ответ, собственно мой вопрос - копия другого, свой фрагмент уже лень было выдергивать. В целом, я так и думал, но до последнего жила надежда, а вдруг есть какая-то хитрость!)
@crazygloom13912 жыл бұрын
@@benya4396 Друг напиши пжт как решил данный вопрос