Какое значение по умолчанию имеет тип int, допускающий значение NULL? (включая вопросительный знак)?

102

Каково значение по умолчанию переменной экземпляра класса типа в C # int??

Например, в следующем коде какое значение будет MyNullableInt, если оно никогда не назначено явно?

class MyClass
{
    public int? MyNullableInt;
}

(Кажется вероятным, что ответ почти наверняка либо nullили 0, но какой из них?)

Джон Шнайдер
источник
9
Почему голос против? (Ответ на этот вопрос изначально не был очевиден для меня без фактического запуска кода для проверки поведения; и, что удивительно, я не смог найти дубликата этого вопроса в StackOverflow или легко найти где-либо еще через Google.)
Джон Шнайдер
1
Вы могли бы посмотреть здесь - первый хит Google.
500 - Внутренняя ошибка сервера
2
@ 500 - Я нашел эту статью, когда занимался исследованием - я фактически связался с ней в своем собственном ответе ниже - но, насколько я могу судить, в статье явно не указано, что значение по умолчанию для экземпляра типа, допускающего значение NULL нулевой. Он действительно говорит: «Значение по умолчанию для HasValue - false. Свойство Value не имеет значения по умолчанию», но это не дает прямого ответа на мой исходный вопрос без дополнительных исследований.
Джон Шнайдер
2
Интересно, было ли это потому, что вы могли просто установить точку останова и посмотреть, какое значение имеет значение, или в типе Immediate Window int? x;и посмотреть, каков будет результат?
Rufus L

Ответы:

136

Значение по умолчанию для int?- и для любого обнуляемого типа, который использует «тип?» декларация - есть null.

Почему это так:

  • int?является синтаксическим сахаром для типа Nullable <T> (где T - это int), структура. ( ссылка )
  • Nullable<T>Тип имеет HasValue Его элемент, который , когда false, делает Nullable<T>экземпляр «действовать как» в nullзначение. В частности, метод Nullable <T> .Equals переопределяется для возврата, trueкогда Nullable<T>with HasValue == falseсравнивается с фактическим nullзначением.
  • Из C # Language Specification 11.3.4 , начальное значение по умолчанию для экземпляра структуры является все поло типа значения этой структуры установлены в их значение по умолчанию, и все полей ссылочного типа этой структуры установлен в null.
  • Значение по умолчанию boolпеременной в C # - false ( ссылка ). Следовательно, HasValueсвойство Nullable<T>экземпляра по умолчанию false: что, в свою очередь, заставляет этот Nullable<T>экземпляр действовать как null.
Джон Шнайдер
источник
Когда я изменяю объявление с int? x = null;на int? x;, я получаю ошибки компилятора ниже в коде: «Использование неназначенной локальной переменной x».
Джон Пик
1
@JohnPick Это функция компилятора C #, предназначенная для предотвращения ошибок, которые могут возникнуть из-за того, что вы «забываете» инициализировать переменную перед ее использованием. Ситуация, когда вы можете столкнуться с неинициализированным int? когда это переменная-член класса. Примеры обоих здесь: blogs.msdn.microsoft.com/abhinaba/2005/11/08/…
Jon Schneider
Так в основном это место - ваш технический блог? Вы задаете вопросы, на которые вам просто нужно запустить код, чтобы получить ответ, а затем сами отвечаете на вопрос в ту же минуту.
GôTô
4
@JonSchneider достаточно честно, тогда мне плохо
GôTô
VS в компилятор намек / предупреждение в заблуждение: Field 'id' is never assigned to, and will always have its default value 0. Странно, правда?
Хенди Ираван
32

Я чувствовал , важно разделять Nullable<T>.GetValueOrDefault()метод , который особенно удобен при работе с математическими вычислениями , которые используют Nullable<int>ака int?значения. Во многих случаях вам не нужно проверять HasValueсобственность, и вы можете просто использовать ее GetValueOrDefault().

var defaultValueOfNullableInt = default(int?);
Console.WriteLine("defaultValueOfNullableInt == {0}", (defaultValueOfNullableInt == null) ? "null" : defaultValueOfNullableInt.ToString());

var defaultValueOfInt = default(int);
Console.WriteLine("defaultValueOfInt == {0}", defaultValueOfInt);

Console.WriteLine("defaultValueOfNullableInt.GetValueOrDefault == {0}", defaultValueOfNullableInt.GetValueOrDefault());

Командная строка, показывающая приведенный выше код, работающий

Брайан Огден
источник
0
var x = default (int?);
Console.WriteLine("x == {0}", (x == null) ? "null" : x.ToString());
Руфус Л
источник