Являются ли обнуляемые типы ссылочными типами? - PullRequest
131 голосов
/ 30 июня 2010

Когда я объявляю int обнуляемым

int? i=null;

Является ли i здесь ссылочным типом?

Ответы [ 6 ]

129 голосов
/ 30 июня 2010

Нет, обнуляемый - это структура. То, что происходит, состоит в том, что обнуляемая структура имеет два значения:

  1. Значение типа данных (int для int?, DateTime для DateTime? и т. Д.).
  2. Логическое значение, которое сообщает, установлено ли значение типа данных. (HasValue является собственностью.)

Когда вы устанавливаете значение типа данных, структура меняет HasValue на true.

Обнуляемые типы (Руководство по программированию в C #)

24 голосов
/ 30 июня 2010

С Обнуляемые типы (Руководство по программированию в C #) :

Обнуляемые типы являются экземплярами структуры System.Nullable.

и

Обнуляемые типы представляют переменные типа значения, которым может быть присвоено значение null. Вы не можете создать обнуляемый тип на основе ссылочного типа. (Типы ссылок уже поддерживают нулевое значение.)

Так, нет, они не являются ссылочными типами.

12 голосов
/ 30 июня 2010

Обнуляемые типы не являются ни типами значений, ни ссылочными типами. Они больше похожи на типы значений, но имеют несколько свойств ссылочных типов.

Естественно, обнуляемые типы могут быть установлены на null. Кроме того, обнуляемый тип не может удовлетворять общему ограничению struct. Кроме того, когда вы помечаете пустым типом значение HasValue, равное false, вы получаете указатель null вместо упакованного в тип обнуляемого типа (аналогичная ситуация существует при распаковке).

Эти свойства делают обнуляемые типы ненулевыми типами, но они также не являются ссылочными типами. Это их собственный особый тип значения Nullable-value.

6 голосов
/ 30 июня 2010

Нет, тип Nullable на самом деле является структурой.Среда выполнения будет интеллектуально обрабатывать установку нулевого значения для вас, создавая вид ссылочного типа, когда это не так ...

1 голос
/ 30 июня 2010

Обнуляемые типы не могут быть ссылочными типами.

http://msdn.microsoft.com/en-us/library/2cf62fcy.aspx

0 голосов
/ 30 июня 2010

Вам не нужно делать ссылочный тип обнуляемым типом, поскольку вместо него можно передать значение null.

...