В чем разница между ссылочным типом и типом значения в c #? - PullRequest
89 голосов
/ 20 февраля 2011

Какой-то парень задал мне этот вопрос пару месяцев назад, и я не смог объяснить его подробно. В чем разница между ссылочным типом и типом значения в C #?

Я знаю, что типы значений int, bool, float и т. Д., А ссылочные типы delegate, interface и т. Д. Или это тоже неправильно?

Можете ли вы объяснить это мне профессионально?

Ответы [ 14 ]

0 голосов
/ 17 июля 2014

Предположим, v является выражением / переменной типа значения, а r является выражением / переменной ссылочного типа

    x = v  
    update(v)  //x will not change value. x stores the old value of v

    x = r 
    update(r)  //x now refers to the updated r. x only stored a link to r, 
               //and r can change but the link to it doesn't .

Таким образом, переменная типа значения хранит фактическое значение (5 или «h»). Переменный ссылочного типа хранит только ссылку на метафорическое поле, в котором находится значение.

0 голосов
/ 24 апреля 2013

Типы переменных и ссылочные значения просты в применении и хорошо применяются к модели предметной области, облегчая процесс разработки.

Чтобы убрать любой миф о величине «типа значения», я прокомментирую, как это обрабатывается на платформе. NET, особенно в C # (CSharp) при вызове APIS и отправке параметров по значению, по ссылке, в наших методах и функциях, а также о том, как правильно обрабатывать фрагменты этих значений.

Прочтите эту статью Значение типа переменной и ссылка на C #

0 голосов
/ 16 марта 2011

Самый простой способ думать о ссылочных типах - это рассматривать их как «идентификаторы объектов»;единственное, что можно сделать с идентификатором объекта, - это создать один, скопировать один, запросить или манипулировать типом одного или сравнить два на равенство.Попытка сделать что-либо еще с идентификатором объекта будет рассматриваться как сокращение для выполнения указанного действия с объектом, на который ссылается этот идентификатор.

Предположим, у меня есть две переменные X и Y типа Car - aссылочный тип.Y содержит «идентификатор объекта # 19531».Если я скажу «X = Y», это заставит X держать «идентификатор объекта # 19531».Обратите внимание, что ни X, ни Y не держит автомобильАвтомобиль, также известный как «идентификатор объекта № 19531», хранится в другом месте.Когда я скопировал Y в X, все, что я сделал, это скопировал идентификационный номер.Теперь предположим, что я говорю X.Color = Colors.Blue.Такое утверждение будет рассматриваться как инструкция, чтобы найти «идентификатор объекта № 19531» и нарисовать его синим цветом.Обратите внимание, что хотя X и Y теперь относятся к синему автомобилю, а не к желтому, оператор на самом деле не влияет на X или Y, потому что оба по-прежнему ссылаются на «идентификатор объекта № 19531», который по-прежнему является тем же автомобилем, что и он.всегда был.

0 голосов
/ 20 февраля 2011

Это, вероятно, неправильно в эзотерическом смысле, но для простоты:

Типы значений - это значения, которые обычно передаются «по значению» (поэтому копируем их).Ссылочные типы передаются «по ссылке» (поэтому указатель указывает на исходное значение).По стандарту .NET ECMA нет никакой гарантии того, где эти «вещи» сохраняются.Вы можете создать реализацию .NET без стеков или без кучи (вторая будет очень сложной, но вы, вероятно, могли бы использовать волокна и множество стеков)

Структуры имеют тип значения (int, bool... являются структурами или, по крайней мере, имитируются как ...), классы являются ссылочными типами.

Типы значений происходят от System.ValueType.Тип ссылки происходит от System.Object.

Сейчас .. В конце концов, у вас есть тип значения, «объекты ссылки» и ссылки (в C ++ они будут называться указателями на объекты. В .NET они непрозрачны. Мыне знаю, что они. С нашей точки зрения, они являются «ручками» для объекта).Эти последние аналогичны типам значений (они передаются копией).Таким образом, объект состоит из объекта (ссылочный тип) и нуля или более ссылок на него (которые похожи на типы значений).Когда имеется ноль ссылок, GC, вероятно, соберет его.

В общем случае (в реализации по умолчанию в .NET) тип значения может идти в стеке (если это локальные поля) или в куче.(если они являются полями класса, если они являются переменными в функции итератора, если они являются переменными, на которые ссылается замыкание, если они являются переменными в асинхронной функции (с использованием более новой Async CTP) ...).Приведенное значение может идти только в кучу.Ссылки используют те же правила, что и типы значений.

В случаях типа значений, которые идут в кучу, потому что они находятся в функции итератора, асинхронной функции или имеют ссылку на замыкание, если вы смотрите скомпилированныйВ файле вы увидите, что компилятор создал класс для помещения этих переменных, и этот класс создается при вызове функции.

Теперь я не знаю, как писать длинные вещи, и мне лучшечем заняться в моей жизни.Если вам нужна «точная», «академическая», «правильная» версия, прочитайте ЭТО:

http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx

Это 15 минут, которые я ищу!Это лучше, чем версии msdn, потому что это сжатая статья "готов к использованию".

...