Что такое класс значений и что такое ссылочный класс в C #? - PullRequest
6 голосов
/ 02 ноября 2009

Каково определение value class и reference class в C #?

Чем это отличается от value type и reference type?

Я задаю этот вопрос, потому что я прочитал его в MCTS Self-Paced Training Kit (экзамен 70-536) Глава 1, Урок 1, Обзор урока 4:

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

Ссылочный класс

B ссылочная структура

класс значений C

Структура значения D

Правильный ответ: D

A Неправильно: Вы можете создать эталонный класс; Однако это может быть изменено при передаче в процедуру.

B Неверно: вы не можете создать справочная структура.

C Неправильно: вы можете создать значение учебный класс; однако структуры, как правило, более эффективный.

D Правильно: структуры значений как правило, наиболее эффективный.

Ответы [ 7 ]

3 голосов
/ 02 ноября 2009

См. обзор по теме, но серьезно следуйте ссылкам msnd и прочитайте полную главу Common Type . (Вы могли бы также задать в комментарии первый вопрос)

2 голосов
/ 02 ноября 2009

Возможно, вы думаете о C ++ / CLI, который, в отличие от C #, позволяет пользователю объявлять «класс значений» или «класс ref». В C # любой объявленный вами класс неявно будет ссылочным классом - только встроенные типы, структуры и перечисления имеют семантику значений. Чтобы прочитать о классе значений в C ++ / CLI, посмотрите здесь: http://www.ddj.com/cpp/184401955

Классы значений имеют очень мало функциональности по сравнению с классами ref и полезны для "простых старых данных"; то есть данные, которые не имеют идентичности. Поскольку вы копируете данные при назначении одного другому, система предоставляет вам конструктор копирования по умолчанию (и обязательный), который просто копирует данные в другой объект.

Чтобы преобразовать класс значения в ссылочный класс (таким образом, поместив его в кучу мусора), вы можете поместить его в «коробку».

Чтобы решить, является ли класс, который вы пишете, одним или другим, спросите себя, есть ли у него идентичность. Обычно это означает, что у него есть какое-то состояние, или есть идентификатор или имя, или понятие собственного контекста (например, узел, указывающий на соседние узлы).

Если это не так, это, вероятно, класс значений.

Однако в C # классы значений объявляются как «структуры».

2 голосов
/ 02 ноября 2009

Типы значений передаются по значению, а типы ссылок передаются по ссылке.

Редактировать: классы значений / ссылок
В C # не существует понятия «класс значений» или «ссылочный класс», поэтому запрос его определения является спорным.

1 голос
/ 02 ноября 2009

Когда вы ссылаетесь на тип значения (то есть, используя его имя), вы говорите о месте в памяти, где находятся данные. Таким образом, типы значений не могут быть нулевыми, потому что в ячейке памяти нет возможности сказать «я ничего не представляю». По умолчанию типы значений передаются по значению (т. Е. Объект, который вы передаете методам, не изменяется в результате выполнения метода).

Когда вы используете объект ссылочного типа, вы фактически используете скрытый указатель. Имя относится к области памяти, которая затем ссылается на место в памяти, где объект фактически живет. Следовательно, вы можете присвоить null ссылочному типу, потому что у них есть способ сказать «я указываю на никуда». Ссылочные типы также позволяют изменять объект в результате выполнения методов, поэтому вы можете изменить свойства myReferenceObject, передав его в вызов метода.

1 голос
/ 02 ноября 2009

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

Типы значений: http://msdn.microsoft.com/en-us/library/s1ax56ch.aspx Типы ссылок: http://msdn.microsoft.com/en-us/library/490f96s2.aspx

0 голосов
/ 02 ноября 2009

Если мое понимание верно, вы можете создать «класс значений» или неизменный класс, используя readonly переменные-члены, инициализированные с помощью конструктора. После создания их нельзя изменить.

0 голосов
/ 02 ноября 2009

Ссылочные типы передаются в методы по ссылочным, а типы значений по значению; в последнем случае метод получает копию переменной, а в первом - ссылку на исходные данные. Если вы измените свою копию, оригинал не изменится. Если вы изменяете исходные данные, на которые у вас есть ссылка, данные изменяются везде, где меняется ссылка на данные. Если бы программа, подобная вашей C # -программе, была создана на C, обычно ссылочные типы были бы похожи на данные с использованием указателей, а типы значений были бы обычными данными в стеке.

Числовые типы, символы, даты, перечисления и структуры являются типами значений. Строки, массивы, делегаты и классы (т. Е. Большинство вещей на самом деле) являются ссылочными типами.

...