a value class
- это ValueType
- это означает, что всякий раз, когда вы присваиваете его другой переменной того же типа, весь объект копируется в другую переменную, оставляя вам две отдельные копии,Примерами этого являются базовые числовые типы данных, такие как int
, bool
или double
.ValueTypes
запечатаны, что означает, что вы не можете извлечь из них.
A ref class
- это ссылочный тип - если вы присваиваете его другой переменной того же типа, вы копируете только ссылку.Таким образом, две переменные в основном «указывают» на одни и те же данные.
Таким образом, основное различие между value class
и ref class
заключается в семантике копирования.Оба могут содержать методы, свойства полей и так далее.Кроме того, вы не можете получить производные от value class
.
Разница между использованием ключевых слов class
и struct
в этом контексте - это видимость членов по умолчанию.Это private
для ref/value class
и public
для ref/value struct
.
Распространенным заблуждением является то, что значение / ref указывает место хранения (значение = стек, ref = куча).Место хранения каждого объекта, будь то ValueType или ссылочный тип, является подробностью реализации, на которую никто не должен полагаться или делать предположения, и только на усмотрение среды выполнения, какое место хранения подходит в любом данном контексте.