Страницы

Поиск по вопросам

понедельник, 9 декабря 2019 г.

Зачем в .NET типы данных разделили на ссылочные и значимые?

#c_sharp #net #дизайн_языка


Зачем в .NET типы данных разделили на ссылочные и значимые? 
    


Ответы

Ответ 1



Различие между ссылочными типами и типами-значениями на самом деле семантическое. Оно не в том, выделяется ли память в куче или нет (язык имеет право любой из объектов располагать в любой памяти, и делает это: например, типы-значения, попавшие в замыкание, будут «подняты» до кучи). Различие состоит в семантике равенства и копирования. Давайте посмотрим на пример. Вот у вас есть число 5. Это число — одно и то же, вне зависимости от того, как вы его получили. Если вы увеличите 5 на 1, вы не измените при этом само число 5, вы просто получите новое число. Когда вы копируете число в другую переменную, эта новая переменная живёт своей жизнью, не зависящей от старого числа. Теперь, пусть у вас есть объект, допустим, СписокПокупок. Этот объект ведёт себя совсем по-другому. Если вы создадите новый СписокПокупок, он будет отличаться от уже существующего: вы можете добавить товар в новый список, а в старом он при этом не появится. С другой стороны, когда вы копируете ссылку на список покупок в другую переменную, то вы продолжаете при это работать с тем же списком. Иными словами: у объектов типа списка покупок есть индивидуальность. А у объектов типа числа такой индивидуальности нет, они ничем не отличаются друг от друга. Так вот: объекты, которые ведут себя как число, и называются объектами-значениями. А объекты с индивидуальностью называются ссылочными объектами. Все остальные технические подробности служат лишь для реализации этой самой различной семантики. Например, объекты-значения чаще всего располагаются в стеке потому, что их можно расположить там: ведь у них никому не интересен конкретный экземпляр, поэтому за пределы метода можно выдать копию. А значит, оригинал можно держать на стеке (так эффективнее). Дополнительная литература: Eric Lippert. The Stack Is An Implementation Detail: Part 1, Part 2.

Комментариев нет:

Отправить комментарий