Найти тему
Programmer

Основы программирования. Не бывает ссылочных и значимых типов, а бывают ссылки и объекты!

Оглавление

В программировании степень дебилизации двуногого населения не просто намного больше других областей жизни, а здесь просто все зашкаливает за все грани, которые вообще возможно поставить... И это мне стало ясно всего за 10 месяцев профессионального знакомства с программированием на языках C++/C , C# , Java , причем количество навязанных людям "непоняток", раскрытых мной, уже накопилось столько много, что я перестал уже их запоминать и начал писать данные статьи.

Нашел, чтоб вы понимали сущность ссылок в программировании
Нашел, чтоб вы понимали сущность ссылок в программировании

Коротко о сущности ссылок и указателей

Итак, давайте разберем самую массовую и "примитивную" непонятку начального нубовского уровня программеров. Говорю я о так называемых "ссылочных" и "значимых" типах в основных языках программирования.

Сам я начал изучать эту отрасль по тысячам имеющихся ложных материалов и мне пришлось долго мучительно днями и ночами разбираться самому с нестыковками в логике, с помощью которых нам пытаются "объяснить" ссылки и объекты и указатели "стандартные учебники" от Microsoft и других официальных авторов.

После долгих многомесячных мучений и размышлений я понял суть всех ссылок, указателей и объектов, безымянных и с именем, мгновенных объектов, констант и readonly, о которых почему-то не говорит ни один в мире автор Microsoft или другой "официальщины". В этой статье я не хочу вам засорять мозг и поговорим только о так называемых ссылках и значимых типах.

Итак, запомните навсегда, что ссылкой является просто виртуальная коробка от объекта, которая находится виртуально в месте нахождения объекта, то есть у объекта может быть таких виртуальных коробок хоть миллион!

От указателя ссылка коренным образом отличается только "безопасностью", то есть ссылка внешне принимает значение объекта, на который она ссылается, а указатель может принимать значение любого адреса оперативки и не зависеть от выделенных объектов.

Запомните навсегда эти короткие мои определения, позже мы разберем подробнейшим образом эти коробки от объектов под названием ссылки и указатели. А сейчас поговорим о теме статьи.

Что такое "ссылочные" и "значимые" типы данных?

Официальщина называет ссылочными типами объекты таких типов, которые созданы в языках Java и C# на основании классов, а классы здесь являются специальными "чертежами" объектов, которые должны обязательно храниться в ссылках (в коробках) принудительно, иначе их соберет грозный "сборщик мусора" (специальный класс Garbage Collector в разных его вариантах в Java и C# ), которого якобы нет в языке C++ (тоже врут).

На самом деле все классы (ссылочные объекты) в Java и C# являются полным аналогом "умных указателей" в C++ (Smart Pointers), только здесь в этих двух языках все классы являются "умными ссылками", которые работают полностью совместно с классом "сборщика мусора" (в C# это класс System.GC). То есть "сборщик мусора" в Java и C# - это специальный класс вроде GC (их много стандартов от старых до новых), в котором прописана логика уничтожения безымянных объектов, на которые больше не ссылается ни одна ссылка (переменная типа класса). Причем этот "мусорщик" работает только с "умными ссылками" или классами (аналог "умных указателей" C++) потому, что уже на уровне "под капотом" (в компиляторах) у всех классов Java C# прописано в логике работать только вместе со "сборщиком мусора".

Ну что? Вам в мире об этом хоть один учебник Рихтеров, Шилдтов, Страуструппов, Риччи, Карниганов расскажет? Никто! Нигде! Молчок! При этом я вам перечислил авторов главных языков и корифеев всего программирования, а современные авторы еще тупее них в тысячи раз... Точнее, я не говорю, что эти люди тупые, а скорее всего им не велено говорить правду и истину и они откровенно лгут, а эту ложь повторяют тупо без обдумывания все в мире блогеры и авторы учебников! Вывод: каждый представитель "стада", кто тупо учится по официальщине, постоянно орет и жалуется: "программирование - это очень сложно и тут ничего непонятно!"

Его можно понять, что тут ничего непонятно, но на кой черт ты без обдумывания сказанной тебе "ДИЧИ" учишься по лживой информации, если тебе это непонятно? Вот так во всем в этом мире...

Ладно. Вернемся к ссылкам и значимым типам. Значимыми типами официальщина называет просто обычные объекты с именем, то есть обычные именные переменные и объекты. И все повторяют стадом за ними... Например, в С++ термином "значимые типы" мы можем называть все классы и структуры, так как здесь все структуры и классы являются по умолчанию именным объектом, а не именной коробкой (не ссылкой). Коренным отличием классов и структур в C++ от C# и Java является их полноценность, то есть классы и структуры в C++ являются полноценными объектами, то есть у этих объектов могут быть имена и может их не быть, также у объектов классов и структур в C++ могут быть ссылки и указатели (то есть коробки).

И наоборот, в C# и Java структуры и классы являются в какой-то степени "кастрированными" типами объектов, то есть у них на каждом шагу одни ограничения с их использованием, зато типа они считаются "безопасными" официальщиной. Стоит заметить, что в Java "опасные" указатели вообще запрещены, а вот в C# они все же присутствуют, но их Microsoft не рекомендует использовать, для их включения нужно указать специальную команду компилятору и в коде указать модификатор unsafe перед блоками применения указателей.

Но мы опять убежали от темы... Смысл данной статьи: моя мысль показать вам, что в программировании не может быть ссылочных типов данных! Вы скажете, что такого не может быть, из каждого утюга официальщина глаголит, что есть "ссылочные" и "значимые" типы данных, хотя она еще говорит о "примитивных" типах данных, но не поясняет, что это такое.

Мы уже с вами разобрали ранее в статьях, что есть понятие переменной типа ссылки (коробки от объекта), то есть в Java и C# при объявлении или создании вами переменной типа класса вы создаете коробку или ссылку от объекта данного класса, а уже сам безымянный объект в эту коробку-ссылку вы создаете с помощью оператора new по примеру ниже.

System.Char [ ] chararray = new System.Char [50];

System.String obj = new System.String (chararray);

В этом примере из языка C# в первой строке создается переменная-ссылка (коробка) на объект массива стандартных символов System.Char, затем оператором "=" ссылке на массив символов (почти на строку) присваивается сам безымянный объект массива символов оператором new, в квадратных скобках указывается число 50, которое говорит компилятору, что под безымянный массив нужно выделить в памяти 50 объектов-символов, которые будут в памяти в прямую линию (но это уже отдельный разговор). По умолчанию объекты массива символов создаются значением "нулевыми", то есть скорее пробелами.

Далее во второй строке примера выше создается стандартная строка (ссылка на объект типа System.String в C# ) в виде коробки от строки с именем obj у коробки, далее оператор "=" присваивает значение коробке obj , после чего коробка от строки obj будет ссылаться (содержать внутри себя) на объект строки, который был создан стандартным конструктором строк из массива символов в первой строке кода. То есть строка во второй строке кода создана из массива символов первой строки кода.

На самом деле конструкторов у своих объектов вы можете создать сколько угодно разных, но вот этот конкретный конструктор создания стандартной строки берет параметром в скобках ссылку на стандартный массив символов (char или System.Char) и делает из него объект-строку, что очень удобно.

Во второй строке кода конструктор объекта строки принимает параметр в виде ссылки на массив символов в скобках, то есть коробка от массива символов "char [ ]" является типом параметра данного метода ил конструктора объекта. Но официальщина почему-то называет это ссылочными типами данных, хотя это просто тип ссылка или коробка.

Если верить официальщине, то и сам массив символов в коробке (в ссылке) также является ссылочным типом данных? Это как? Ведь массив символов здесь представлен безымянным объектом, который создается оператором new и запихивается в ссылку (в коробку) оператором "="! Но где тогда "ссылочный" тип? Коробка-ссылка от массива или сам безымянный массив символов? Здесь официальщина вам никак не отвечает.

Вывод: нет ссылочных типов, а есть ссылка (коробка) на безымянный объект или на объект с именем, а есть сам объект с именем или без, который может быть помещен в ссылку или коробку!

И теперь по поводу "значимых" объектов. Здесь вам также подменяют понятия, ибо они называют "значимыми" типами данных структуры в C# и "оберточные примитивные" типы данных в Java ( в Java нет структур). Но почему они называют "кастрированные" объекты с именем (переменные) в Java и C# "значимыми" типами? А все только потому, что структуры C# и "оберточные примитивные" типы Java не могут иметь ссылок или коробок от своих объектов, но они имеют имя. А теперь вспомните, что в C++ все структуры и классы имеют и имя и могут иметь коробки (ссылки), поэтому в С++ в принципе нет проблемы "упаковки и распаковки", с которой носятся все идиоты в C# и Java и не понимают смысл проблемы...

Вывод: не бывает значимых типов, а бывают "кастрированные" объекты с именем в C# и Java, которые территориально находятся в сверхбыстрой малой "вечной" памяти "стека" и им запрещено иметь коробку или ссылку на объект!

-------------------------------------------------------------------------------------

Ну вот, товарищи, вроде совсем немного хотел, пару мыслей срочных написать, а вышла целая глава "романа", хотя по сути ничего не рассказал, только немного коснулся важной темы. Но подробно мы будем позже каждую деталь разбирать, если, конечно, доживем до этого счастливого момента. Ставьте лайки и подписывайтесь. Пока всем!