C# урок № 13 - ссылочные (reference type) и размерные/значимые типы/типы значений (value type).

  Рет қаралды 7,091

SBeregovoyRU

SBeregovoyRU

3 жыл бұрын

Данная тема одновременно важная и сложная. Для того, чтобы по настоящему разобраться во всех тонкостях ссылочных и размерных типов нужно дойти до архитектуры компьютера и устройства операционных систем. Но в рамках видеоурока это не возможно. Поэтому я даю краткий обзор основных принципиальных понятий для того, чтобы вы могли программировать на C# без шаманства и бубна.
-------------------
Ваше участие очень важно для развития моего канала. Самое мало, что вы можете сделать это поддержать канал любым доступным вам способом: лайк, комментарий, подписка. Меня это мотивирует на продолжение работы, а вам ничего не стоит.
Если вы хотите меня отблагодарить донатом и поддержать развитие канала:
money.yandex.ru/to/4100184436534
В комментариях можно указать тему или идею для нового видео, которую вы бы хотели увидеть на канале. Естественно, мнение тех, кто меня поддерживает финансово я буду учитывать в первую очередь.
Личные вопросы о помощи в программирование и построении карьеры в IT можно задавать тут sberegovoy.ru/mentor/
--------------------
Оставайтесь на связи:
Мой сайт - sberegovoy.ru
Вступайте в телеграмм канал - t.me/sberegovoy
Группа в телеграмме - t.me/group_sberegovoyru
Вступайте в группу ВК - sberegovoyru
#ityoutubersru

Пікірлер: 86
@qwerty89993
@qwerty89993 6 ай бұрын
Отличные уроки, несправедливо мало подписчиков на канале. Большое спасибо автору
@olejakosmolet1453
@olejakosmolet1453 Жыл бұрын
Спасибо за мотивацию почитать хорошую литературу и понятное разъяснение материала
@policedog757
@policedog757 Жыл бұрын
Честно не до конца понимал значение модификаторов ref/out, что такое valuet || reft... И после этого урока я отлично понял эту тему, спасибо!
@DAZZ313
@DAZZ313 3 жыл бұрын
Урок сложный, но рассказано просто идеально спасибо!!!!
@putler-kaputt
@putler-kaputt Жыл бұрын
Гы--гы)) Я для себя это как-то так понял: Вот есть бутылка водки стеклянная 0.5 литра, это капец какой значимый тип для россиянина)) Хотя, конечно, содержимое бутылок разное бывает, пиво, лимонад. Можно откупорить её, опустошить, налить другую жидкость. Бутылки это важная тема! Но когда этих бутылок дофига, то уже нужна тара под них, чтобы перевозить, считать, не разбить -- массив тары на 20 поллитровок водки. Бутылки это самоценная сущность, а тара под них, это что-то вторичное. Поэтому нет смысла создавать каждый раз новую коробку-тару под водку, если бутылок от этого больше не становиться. Однако есть смысл клеить на коробку-тару РАЗНЫЕ ЭТИКЕТКИ и печатать надписи: дата выпуска с завода, таможенные контроль и т.п. А потом, где-то в документах и отчётах, сослаться на эту тару с бутылками. Конечно, можно создавать вместе с тарой-массивом ещё и новые бутылки-переменные, но бутылки с водкой бесплатно сами собой из воздуха не появляются а стоят каких-то денег и ресурсов -- процессорное время и ОЗУ. Т.е. если бы не было ссылочных типов в ООП, то получался бы какой-то бред, а-ля: есть ящик водки и есть какой-то алгоритм для его применения (процедура). Взяли ящик, открыли, пересчитали бутылки и проверили содержимое -- процедура окончена. Далее, нам нужно этот ящик водки отправить в магазин на продажу, но вместо этого мы его ПОЛНОСТЬЮ РАЗРУШАЕМ, и создаём новый точно такой же ящик-тару с бутылками которые и отдаём))
@vladlenbulatov1022
@vladlenbulatov1022 Ай бұрын
@@putler-kaputt слишком "многа букав", посмотрите примеры программ, печатающих самих себя - учитесь, оно полезно!
@vespa6407
@vespa6407 2 жыл бұрын
Степан, большое спасибо за ваш труд! Раскрыли действительно сложные детали и некоторые вещи стали очень понятны.
@user-lx5vv3uu8u
@user-lx5vv3uu8u 3 жыл бұрын
Степан, привет! Спасибо за крутейшую подачу материала!
@DAZZ313
@DAZZ313 3 жыл бұрын
Степан спасибо большое!!!
@Andrii.88
@Andrii.88 3 жыл бұрын
Приветствую. Спасибо за контент.
@gedonik
@gedonik 3 жыл бұрын
Спасибо большое, ваши уроки мотивируют учиться!
@user-ls9ro4vi9l
@user-ls9ro4vi9l 3 жыл бұрын
Большое спасибо за урок!! А то заждались ваших уроков))
@emistar3780
@emistar3780 3 жыл бұрын
Отличный и полезный урок! Спасибо!
@sergeismazheluk1662
@sergeismazheluk1662 3 жыл бұрын
Смотрим уроки по порядку и с большим желанием. Спасибо Степан, ну и как всегда, ждем новых видео!
@bumer23011983
@bumer23011983 3 жыл бұрын
Спасибо за урок. Очень познавательно.
@RG-hx8ym
@RG-hx8ym 3 жыл бұрын
Ставьте лайки, человек заслужил. Это не больно.
@champer4887
@champer4887 3 жыл бұрын
Все четко, Степан! Продолжай в том же духе))))
@user-ry7ij2io1b
@user-ry7ij2io1b 3 жыл бұрын
Спасибо! Грамотно объясняешь! :)
@mariakottur
@mariakottur 3 жыл бұрын
Недавно потребовалось быстренько с джавы на шарп перейти. Думал, где бы инфу взять в более-менее удобном и понятном виде. И тут вспоминаю про твой канал! Просто смотрю у тебя видео, не касающиеся шарпа (а из этого плейлиста только ООП смотрел). В общем, спасибо за уроки :)
@maksym7094
@maksym7094 3 жыл бұрын
Очень достойное объяснение!
@user-ec9gs6hf7z
@user-ec9gs6hf7z 3 жыл бұрын
Спасибо большое, на втором курсе проходим с# твои уроки очень помогают нам)))
@SBeregovoyRU
@SBeregovoyRU 3 жыл бұрын
Терпения в освоении программирования!
@TheFryOS
@TheFryOS 3 жыл бұрын
Спасибо!
@Raventus100
@Raventus100 3 жыл бұрын
Спасибо за урок. Для полноты раскрытия темы, по моему мнению, не хватило сравнения структуры (значимого типа) и класса (ссылочного), но, я уверен, эта тема у нас еще впереди
@SBeregovoyRU
@SBeregovoyRU 3 жыл бұрын
структуры отдельно будут
@dasstillsmile8458
@dasstillsmile8458 Жыл бұрын
Очень интересно и доходчиво, спасибо вам Сергей ! Жаль что ролики давно не выходят, планируете возвращение на ютуб ?
@mikkimorfin5406
@mikkimorfin5406 3 жыл бұрын
Спасибо хорошее обьяснение,надо только попрактиковатся.А так все супер.👍🙂
@user-mm1xr5to1o
@user-mm1xr5to1o 3 жыл бұрын
Спасибо )))
@user-ew4fd8qp7b
@user-ew4fd8qp7b 9 ай бұрын
cпасибо
@Re-tj8bt
@Re-tj8bt 3 жыл бұрын
👍
@rdragon587
@rdragon587 3 жыл бұрын
Thanks)
@Hedohaac
@Hedohaac 2 жыл бұрын
Спасибо за урок. Всё чётко и понятно. А тема и правда слишком обширная. Думаю, что ещё не скоро на должном уровне начну её понимать.
@KREKER8331
@KREKER8331 3 жыл бұрын
Степан спасибо большое за уроки и прекрасную подачу материала. Очень хотелось бы отдельного видео про .Net ,что это за платформа и подробнее про сам язык C# и его применение. Вроде такого видео у вас не нашел...
@SBeregovoyRU
@SBeregovoyRU 3 жыл бұрын
будет такое видео
@user-kr6ml1lj4k
@user-kr6ml1lj4k 2 жыл бұрын
Жаль мало просмотров набирает этот канал. Учу c# by myself и, по сравнению с другими каналами, Степан Береговой прям разжёвывает до сути. Очень-очень-очень нудно, но получается, что лучше один раз посмотреть 30 минут Степана, чем несколько раз смотреть других - больше времени затратится. Даже ITVDN с А.Шевчуком мне "не зашли" так ясно, как Степан, хотя, по моему мнению, ITVDN здорово рулит. Наверное, очень хорошо у него /* у Степана */ учиться в частном порядке. Степану отдельное Спасибо.
@vitalijuskolinko9011
@vitalijuskolinko9011 3 жыл бұрын
Хоть и изучаю Java, но всё равно интересно! Спасибо за StringBuilder. Теперь понял, для чего он нужен :))) Не припомню насчет ref в Java, но часто использую AtomicReference в операциях с lambda или stream )))
@SBeregovoyRU
@SBeregovoyRU 3 жыл бұрын
насколько я знаю в Java все типы ссылочные
@user-td5bw9rt2g
@user-td5bw9rt2g 3 жыл бұрын
@@SBeregovoyRU нет имеются восемь примитивных типов. Все ссылочные в Питоне.
@alukardishe
@alukardishe 2 жыл бұрын
ну так способ копирования по значению или по ссылке как раз и определяет ОТКУДА будет производиться копирование и что будет передаваться. Поэтому, на мой взгляд вы говорите об этом довольно без должной толики важности (мол, смотрите только по способу копирования), и это НЕ! даст понимания ПОЧЕМУ это так происходит. А без знания ПОЧЕМУ это так происходит, можно наворотить делов в будущем
@alexanderkahm1798
@alexanderkahm1798 2 жыл бұрын
call by reference and call by value ;)
@lohengrinlombano585
@lohengrinlombano585 3 жыл бұрын
Благодарю за отличное вводное видео, но позвольте немного повредничать :) Всё-таки указатель и ссылка - разные вещи, если бы речь шла, например, о джаве, то они были бы, по сути, эквиваленты, но в C# есть unsafe контекст, где как раз-таки есть указатели, и они немного, но существенно отличаются - в отличии от ссылок, они статичны: находятся вне поля зрения сборщика мусора и не могут быть изменены/удалены в какой то случайный момент времени. Также среда выполнения для них ничего не гарантирует, и по указателю может лежать что угодно.. Надеюсь, автор когда-нибудь покроет тему взаимодействия с неуправляемым кодом и библиотеками, уж больно хорошо у него получается )
@superspy2008
@superspy2008 3 жыл бұрын
ссылка это управляемый указатель, противоречий нет. Любое обращение к полям объекта через точку является разыменованием указателя
@woooow43
@woooow43 3 жыл бұрын
у меня тут вопрос. простите что не по теме. есть ли средство для автоматического переноса статического поля из одного класса в другой? например сразу переименовать все вызовы вида Class1.fieldA в Class2.fieldA. или только ручками через Ctrl-h?
@Alexander.Kravchenko
@Alexander.Kravchenko 3 жыл бұрын
Ну если вы используете Resharper, то там есть подходящий рефакторинг. www.jetbrains.com/help/resharper/Refactorings__Move__Type_to_Another_Type.html
@woooow43
@woooow43 3 жыл бұрын
Resharper для моей VSCode будет слишком громоздким, и с таким ценником новичку он ни к чему. просто думал есть встроенные средства, но оказалось авторефакторинг это сложно, дорого и никому не нужно.
@alexandr1408
@alexandr1408 3 жыл бұрын
Вопрос (из трех частей) по хранению значимого типа в памяти. Мучает меня этот вовпрос. Немного запутанный, поэтому начну издалека. int переменная хранится в стеке, т.е. там хранится непосредственно само значение, а не ссылка (сделаем именно такое утверждение, т.е. не будем рассматривать случай объявления переменной внутри класса). Хорошо. Дальше. 1. Предположим, есть структура (struct), где объявлено десять int полей (с произвольными значениями). Если простой int хранится в стеке в виде значения, то ЧТО и ГДЕ хранится в случае нашей структуры? Если там хранятся значения десяти чисел, то в переменной-экземпляре структуры должна хранится ссылка на эту область данных в стеке? 2. В переменной значимого (структурного) типа хранится экземпляр типа (docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/builtin-types/value-types). Рихтер (вопреки вышенаписанному "в переменной-экземпляре структуры должна хранится ссылка на эту область данных в стеке") говорит, что в переменной-экземпляре нет ссылки на экземпляр, и все поля экземпляра размещаются в самой переменной (глава 5). Но каким образом в этой несчастной переменной могут храниться десять четырехбайтовых значений (Int)? Значит на более низком уровне в этой переменной так или иначе хранится ссылка на область памяти, или как? 3. Int32 (просто для примера) - структура, но структура со своими полями и методами, а значит объект-тип хранится в куче, открытые члены этого типа доступны через экземплярный вызов в нашей переменной (имею ввиду : int x = 10; string s = x.ToString(); или вообще что-то типа : 123.ToString();) Но здесь, я так понимаю, просто игра компилятора, он понимает, что мы хотим, и подтягивает нужный функционал из объект-типа. Или нет? Немного запутанно, но, думаю, понятно, что мне не совсем понятно) Степан, надеюсь, в одном из уроков или в комменте Вы сможете разъяснить этот момент. Заранее спасибо)
@SBeregovoyRU
@SBeregovoyRU 3 жыл бұрын
Стек это тоже область памяти. Никто не запрещает считать, что байты начиная от позиции N до N + X (где X размер структуры, а точнее примитивов в нее входящих) заняты каким-то типом, который читается именно целиком.
@SBeregovoyRU
@SBeregovoyRU 3 жыл бұрын
Ну и по третьему вопросу: описания типов хранятся отдельно, не в куче где лежат данные типов. А есть специальная область памяти.
@alexandr1408
@alexandr1408 3 жыл бұрын
@@SBeregovoyRU Спасибо за ответ). Более менее я для себя разложил все по полочкам.
@user-dj6fx8rh1v
@user-dj6fx8rh1v 3 жыл бұрын
Очень,интересный урок...Правда,у меня сложилось впечатление,что ссылка влияет на изменение области данных,на которую ссылается!?Вы показали метод,прием,о котором хотелось бы получить более подробное представление его применения,но в ходе,само анализа ваших действий,возник вопрос!?Поправьте меня,если это не так,..Мне кажется,что и у ссылки,имеется некая область для хранения адресации самой ссылки,и ее некой копии!?
@venom5583
@venom5583 3 жыл бұрын
Чувак!?? тебе, стоит! почитать: про... знаки препинания??? Они? существуют! не - просто; для, красоты?! Как??? ты собираешься! писать: код с - таким бардаком))) в? голове!
@agens9538
@agens9538 Жыл бұрын
Int унаследован от object через struct, как он из ссылочного стал значимым?
@user-xp8id7fe4t
@user-xp8id7fe4t 2 жыл бұрын
Интересно. Столкнувшись в C# с проблемой копирования объектов ссылочного типа в своей работе, я, ничего не зная о клонировании (Clone), написал свои собственные методы. Метод для массивов переприсваивает в цикле каждый элемент другому массиву. А методы для классов (для копирования экземпляра класса) используют конструктор (new) для инициализации нового объекта этого класса, который возвращает этот метод. При этом, если при вызове конструктора используются данные других ссылочных типов (как входные параметры), то эти данные подвергаются такой же операции (для массивов переприсвоение, для классов - конструктор). На первый взгляд это может показаться сложным, но получилось всё довольно компактно, и главное - работает ! Не знаю только что более рационально по быстродействию и затратам памяти - мои методы или Clone ?
@SBeregovoyRU
@SBeregovoyRU 2 жыл бұрын
Предполагаю, что Clone :)
@cadefoster5853
@cadefoster5853 3 жыл бұрын
Спасибо! Странно что в названии видео, наряду с "размерные/значимые типы/типы значений" не указано "структурные", это же тоже весьма распространенное название всех вэлью тайпов). Кстати, никогда не слышал, чтобы структурные типы называли размерными.
@SBeregovoyRU
@SBeregovoyRU 3 жыл бұрын
незнание этих нюансов с копированием объектов может выбесить конкретно. А знания в глубину по этой теме я и предлагаю самостоятельно и как-нибудь потом изучить.
@cadefoster5853
@cadefoster5853 3 жыл бұрын
@@SBeregovoyRU я все же позволю себе позанудствовать относительно терминологии)) Когда вы говорите про "структурные/типы значения" типы, то называете их значимыми типами. Но так называть их неверно, так как слово "значимый" имеет другой смысл. Полагаю, что это просто ошибка переводчика, который вместо "тип значения" перевел "значимый тип", и с этого все подхватили это ошибочное выражение. Обычно их просто называют структурными типами, по понятным причинам) так получается грамотнее и короче к произношению.
@SBeregovoyRU
@SBeregovoyRU 3 жыл бұрын
@@cadefoster5853 тут уже устоявшийся термин, который так переводят уже давно ( лет 15 как минимум), я бы переводил "тип со значением"
@emistar3780
@emistar3780 3 жыл бұрын
@@SBeregovoyRU я помню, как тип по значению, тип по ссылке.
@vladlenbulatov1022
@vladlenbulatov1022 Ай бұрын
Маладцом, хотя... вумные студенты прибегут и спросят, а регистровая память как? а стек, да и ваапще вские кеши...
@By-pf6bw
@By-pf6bw 3 жыл бұрын
Я предполагаю,что вы дадите нам основы,а дальше уже нужно изучать по книгам?для совершенствования?
@SBeregovoyRU
@SBeregovoyRU 3 жыл бұрын
Уже можно и нужно изучать самостоятельно любым доступным вам способом.
@By-pf6bw
@By-pf6bw 3 жыл бұрын
@@SBeregovoyRU с# будет хорошим выбором?
@benatanesyan8315
@benatanesyan8315 3 жыл бұрын
а как же ключевое слово out? Думаю об этом тоже стоит поговорить) P.S не ну однозначно лайк++
@Dimonina
@Dimonina 3 жыл бұрын
кодю на шарпе больше 10 лет, никогда не использовал out
@getright20
@getright20 3 жыл бұрын
как по мне лучше код писать в самом проекте - в этой консоле после 10 записей уже сложно воспринимаются вводы - выводы.
@SBeregovoyRU
@SBeregovoyRU 3 жыл бұрын
не думаю, что было бы лучше если бы я после каждой строки запускал билд и все обрамлял console.writeline
@denisp726
@denisp726 3 жыл бұрын
Степан, Рихтера почти прочитал? ))
@SBeregovoyRU
@SBeregovoyRU 3 жыл бұрын
в процессе ))
@user-ne4bd3ry1n
@user-ne4bd3ry1n 2 жыл бұрын
на 10.05 Вы специально говорите что копируем? а на самом деле вы создаете ссылку.
@ArchyAngle
@ArchyAngle 3 жыл бұрын
а где же : "Давайте расти вместе" ?
@user-ne4bd3ry1n
@user-ne4bd3ry1n 2 жыл бұрын
странно почему тема сложная. в Си с этого начинают - есть типы , а есть указатели на типы. к тому же в Си есть адресная арифметика.
@superspy2008
@superspy2008 3 жыл бұрын
а откуда такой термин "размерный тип данных"? первый раз в жизни услышал, всегда такие были типами значений, аж слух режет
@SBeregovoyRU
@SBeregovoyRU 3 жыл бұрын
например, Джефри Рихтер, Программирование на платформе .NET, издательство Питер
@superspy2008
@superspy2008 3 жыл бұрын
@@SBeregovoyRU Рихтера какой-то веселый человек переводил, я пытался читать, но не осилил. Там можно просто на цитаты разбирать книгу
@emistar3780
@emistar3780 3 жыл бұрын
@@superspy2008 Наверное стоит читать в оригинале.
@superspy2008
@superspy2008 3 жыл бұрын
@@emistar3780 наверное, стоит сначала выучить тот язык, на котором написан оригинал, до уровня, который позволит читать подобные книги без выкипания мозга на 3 странице введения. Не у всех есть такие ресурсы и такая мотивация
@emistar3780
@emistar3780 3 жыл бұрын
@@superspy2008 я тоже так думал, но это лишь дело практики. Сначала да, долго и терпения не хватает, но после становится легче и это лучшая практика. Это наверно можно сравнить с тем же обучение языку программирования, по началу сложно, больше пишешь и практикуешь и становится лучше.
@user-vg6gu8hc6w
@user-vg6gu8hc6w 3 жыл бұрын
Нео не ты ли это?(во всяком случаи на аве) видео не смотрел...
@Zagabuba
@Zagabuba 3 жыл бұрын
Прекрати ездить на стуле и поставь камеру по человечески. Такое ощущение что ты первый раз видишь клавиатуру и стул с колесиками. Складывается ощущение что тебя под дулом пистолета заставляют это говорить.
@SBeregovoyRU
@SBeregovoyRU 3 жыл бұрын
)) я снимаю все видео стоя без стула
@SBeregovoyRU
@SBeregovoyRU 3 жыл бұрын
а чем камера не угодила?
@emistar3780
@emistar3780 3 жыл бұрын
@@SBeregovoyRU ничего плохо не заметил, я больше сосредоточен на код и объяснение.
@venom5583
@venom5583 3 жыл бұрын
Чувак без камеры бубнящий в глухой микрофон в играх решил покритиковать чужой контент, забыв добавить хотя бы каплю конструктива. Можешь для начала записать видеогайд как ставить камеру "по человечески") Не наберешь ты просмотров такими бездарными методами и донатить больше не станут, лучше иди на завод)
@venom5583
@venom5583 3 жыл бұрын
@@SBeregovoyRU все отлично с камерой, хотя пару раз с этим ракурсом промелькнул вопрос почему рядом со столом стоит холодильник, пока не присмотрелся)
Smart Sigma Kid #funny #sigma #comedy
00:19
CRAZY GREAPA
Рет қаралды 22 МЛН
He sees meat everywhere 😄🥩
00:11
AngLova
Рет қаралды 8 МЛН
Vivaan  Tanya once again pranked Papa 🤣😇🤣
00:10
seema lamba
Рет қаралды 21 МЛН
C#. Covariance and Contravariance in generic interfaces.
6:35
ExtremeCode
Рет қаралды 80 М.
Послушайте как работает стол с регулировкой высоты ТИТАН
0:38
StolStoya - мебель и столы для работы стоя
Рет қаралды 1,4 М.
Просто о SOLID (Принципы SOLID)
15:54
webDev
Рет қаралды 215 М.
C# Стек и Куча | Stack and Heap | Часть 1
11:02
Посмотрите как поднимается StolStoya Титан
0:11
StolStoya - мебель и столы для работы стоя
Рет қаралды 1,6 М.
1$ vs 500$ ВИРТУАЛЬНАЯ РЕАЛЬНОСТЬ !
23:20
GoldenBurst
Рет қаралды 1,1 МЛН
Какой ПК нужен для Escape From Tarkov?
0:48
CompShop Shorts
Рет қаралды 273 М.
Игровой Комп с Авито за 4500р
1:00
ЖЕЛЕЗНЫЙ КОРОЛЬ
Рет қаралды 460 М.
#miniphone
0:16
Miniphone
Рет қаралды 3,6 МЛН
Неразрушаемый смартфон
1:00
Status
Рет қаралды 1,8 МЛН