? (nullable) в C #

Что изменилось, применив nullable Operator к типу данных типа значения, чтобы теперь он мог хранить нуль.

Как говорили другие, «?» является просто сокращением для изменения его на Nullable . Это всего лишь еще один тип значения с булевым флагом, чтобы сказать, действительно ли полезное значение, или это нулевое значение для типа. Другими словами, Nullable выглядит примерно так:

 public struct Nullable { private readonly bool hasValue; public bool HasValue { get { return hasValue; } } private readonly T value; public T value { get { if (!hasValue) { throw new InvalidOperationException(); } return value; } } public Nullable(T value) { this.value = value; this.hasValue = true; } // Calling new Nullable() or whatever will use the // implicit initialization which leaves value as default(T) // and hasValue as false. } 

Очевидно, что в реальном коде существует больше методов (например, GetValueOrDefault() ) и операторов преобразования и т. Д. Компилятор C # добавляет отмененных операторов, которые эффективно проксируют исходные операторы для T

Риск звучать как сломанная запись, это все еще тип значения. Это не связано с боксом … и когда вы пишете:

 int? x = null; 

это не нулевая ссылка – это нулевое значение Nullable , то есть тот, где hasValue является false .

Когда нулевой тип помещается в бокс, CLR имеет функцию, при которой значение либо помещается в нуль, либо равномерно nested T. Так что, если у вас есть такой код:

 int? x = 5; int y = 5; object o1 = x; object o2 = y; 

Коробчатые значения, на которые ссылаются o1 и o2 , неотличимы. Вы не можете сказать, что это результат бокса с нулевым типом.

? синтаксис – это синтаксический сахар для структуры Nullable .

В сущности, когда вы пишете int? myNullableInt int? myNullableInt , компилятор изменяет его на Nullable myNullableInt .

Из MSDN (прокрутите вниз до «Обзор Nullable Types»):

Синтаксис T? является сокращением для Nullable, где T – тип значения. Эти две формы взаимозаменяемы.

Ничто не изменяется в самом типе значений, оно просто завернуто в структуру System.Nullable . http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx

Тип изменяется с того, что раньше было на тип Nullable.

Если у вас был int и решил сделать это int ?:

 int myInt; 

И вы это сделаете:

 int? myInt; 

сейчас:

 Nullable myInt; 

В действительности.

В базовых терминах тип с нулевым значением представляет собой коробчатую версию нормального типа с дополнительным булевым полем с именем hasValue. Если для этого поля установлено значение false, то экземпляр имеет значение null.

Ознакомьтесь с этим ответом для более подробной информации о реализации CLR и почему они, возможно, выбрали это: Бокс / Unboxing Nullable Types – Почему эта реализация?

  • Ускорение производительности с типами «как» и «с нулевыми значениями»
  • Включить объект до десятичного? (с нулевым числом)
  • Сериализация Nullable в XML
  • В C # почему оператор условного оператора неявно не вводится в тип с нулевым значением
  • Как преобразовать C # nullable int в int
  • Interesting Posts
    Давайте будем гением компьютера.