Механизм присваивания и передачи Immutable types (Records) в качестве аргументов функции в C#

В общем в C# мы с коробки имеем единственный неизменяемый тип - string. Во многих учебниках описано, что это гибридный тип, который ведет себя как обычная структура, но при этом является классом. То есть является ссылочным типом и хранится только в куче.

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

Еще там упоминалось о том, что это является "альтернатива" интернированию строк, при котором в начальных версиях C# все строки хранились только в 1м экземпляре. Из за чего были сильные потери в производительности на проверку уникальности строки во всем приложении.

Когда я ознакомился с Record типами - то как бы думал, что они работают таким же образом. Но в MSDN ничего об этом не сказано, зато сказано:введите сюда описание изображения

Что заставляет сомневаться что они работают также как и string, то есть постоянно копируются при передаче как аргументы.(Потому что тут указаны и изменяемые и неизменяемые Record и нет пометок про string, а значит наверное C# на это вообще не смотрит и это является просто "сахаром", который пишет за вас перегрузки методов и свойств, а не встроенной фичей как у string)

Поэтому у меня вопрос - так ли это? Или они действительно себя ведут как строки? Дело еще в том, что в описании сказано, что Record могут быть изменяемыми и могут быть по сути классами и структурами, в зависимости от того как объявить тип. Поэтому встречный вопрос - сохраняется ли эта фишка с присваиваниями в каком-то конкретном случае. Где найти ответы на эти вопросы? Или поделитесь вашими знаниями, пожалуйста.

P.S. Еще знаю такую инфу, что если передача аргумента происходит с меткой 'in' то как бы C# пытается обеспечить неизменяемость и создает копии структур, но при этом если структура является readonly - то копия не создается и структура передается по ссылке. Так что вот такой еще нюанс. И обидно что это в MSDN нигде толком не расписано. (как оно работает с Record)


Ответы (0 шт):