Что такое Класс Значения и что такое класс ссылки в C#?

Та же проблема, что у меня была с службами отчетов SQL. Попробуйте проверить тип переменных, я отправлял переменные другого типа в SQL, например, отправлял varchar туда, где он должен быть целым числом, или что-то в этом роде. После того, как я синхронизировал типы переменных в Reporting Service и в хранимых процедурах на SQL, я решил проблему.

6
задан Bastien Vandamme 2 November 2009 в 01:53
поделиться

7 ответов

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

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

2
ответ дан 10 December 2019 в 02:49
поделиться

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

3
ответ дан 10 December 2019 в 02:49
поделиться

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

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

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

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

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

В C #,

2
ответ дан 10 December 2019 в 02:49
поделиться

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

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

1
ответ дан 10 December 2019 в 02:49
поделиться

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

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

0
ответ дан 10 December 2019 в 02:49
поделиться

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

0
ответ дан 10 December 2019 в 02:49
поделиться

Типы значений хранят фактические данные в то время как ссылочные типы хранят ссылки на данные. Ссылочные типы динамически хранятся в куче, а типы значений хранятся в стеке. Типы ссылок: http://msdn.microsoft.com/en-us/library/490f96s2.aspx

1
ответ дан 10 December 2019 в 02:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: