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