Подтвердить что ты не робот

Объяснение int? vs int

Возможный дубликат:
В чем разница между 'int?' и 'int' в С#?

Я встретил некоторый код в С#, который объявляет переменную как: int? number

Что означает ? и как это отличается от просто: int

4b9b3361

Ответ 1

int не может быть null.

int? является псевдонимом для структуры Nullable<int>, которую вы можете установить в null.

Ответ 2

int? является сокращением для создания экземпляра типового типа структуры System.Nullable<T>. Это позволяет сделать вашу переменную нулевой. Помните, что если синтаксис <ValueType>? является сокращением, вы можете объявить свои переменные таким образом:

Nullable<int> i = 10;

Ответ 3

int? является сокращением для Nullable<int>, которое позволяет вам притворяться, что целое число может обрабатывать нули.

int? foo = null;

Это полезно для указания отсутствия значения, когда вы ранее использовали магическое значение (-1) в прошлом, а также полезно при работе со столбцами базы данных, которые допускают нулевые записи.

Для квазиуровневого обзора a Nullable<T> (введенный в .NET 2.0) представляет собой просто оболочку над типом значения T, который предоставляет два свойства: HasValue и Value, где HasValue - это логическое значение, указывающее, было ли задано значение и Value (очевидно, достаточно) возвращает значение. Ошибка доступа к Value, если HasValue - false. Поэтому для доступа к Value сначала нужно проверить HasValue. Кроме того, если вы просто хотите нормализовать любые значения, отличные от значений по умолчанию (0 для числовых типов), вы можете использовать метод GetValueOrDefault(), не проверяя HasValue.

Обратите внимание, что, хотя вы, кажется, устанавливаете foo в null, он не является фактически нулевым при обычных сценариях использования. null - это просто дополнительный синтаксический сахар для этого типа. Вышеприведенная строка кода преобразуется в

Nullable<int> foo = new Nullable<int>();

Инициализация переменной таким образом просто устанавливает для свойства HasValue значение false.

Однако в ситуациях, связанных с боксом, значение действительно будет иметь значение null, если HasValue является ложным (в противном случае он будет равен T). Помните о последствиях! Например, в:

int? foo = null; 
string bar = foo.ToString(); // this is fine, returns string.Empty
Type type = foo.GetType(); // blows up! GetType causes the value to box
                           // resulting in a NullReferenceException

Это быстрый краш-курс. Для получения дополнительной информации посетите документацию.

Ответ 4

Это синтаксический сахара-компилятор для Nullable<int>

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

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

Как отмечает @Kyle Trauberman в комментарии, вы действительно можете сравнить его с null вместо проверки HasValue. Сам тип является типом значений с переопределенными методами равенства, так что, поскольку он никогда не будет нулем, он вернет true по сравнению с нулевым, если он не имеет значения.

Ответ 5

Вопросительный знак за объявлением означает, что переменная имеет значение NULL.