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

Как типы с нулевым значением реализуются под капотом в .net?

В нашем собственном Jon Skeet С# в глубине, он обсуждает 3 способа моделирования "null" для типов значений:

  • Магическое значение (например, как можно скорее DateTime считается "null" )
  • Обозначение ссылочного типа
  • boolean flag

Говорят, что типы с нулевым значением используют третий метод. Как точно работают типы с нулевым значением под капотом?

4b9b3361

Ответ 1

В конечном счете, это всего лишь общая структура с флагом bool - за исключением специальных правил бокса. Поскольку structs (по умолчанию) инициализируется до нуля, bool по умолчанию имеет значение false (no value):

public struct Nullable<T> where T : struct {
    private readonly T value;
    private readonly bool hasValue;
    public Nullable(T value) {
        this.value = value;
        hasValue = true;
    }
    public T Value {
        get {
           if(!hasValue) throw some exception ;-p
           return value;
        }
    }
    public T GetValueOrDefault() { return value; }
    public bool HasValue {get {return hasValue;}}
    public static explicit operator T(Nullable<T> value) {
        return value.Value; }
    public static implicit operator Nullable<T>(T value) {
        return new Nullable<T>(value); }
}

Дополнительные отличия:

  • специальные правила бокса (вы не можете это сделать обычно)
  • специальные правила С# для сравнения с нулем и т.д.
  • "снятые" операторы в С# (и в .NET через EqualityComparer<T>, Comparer<T> и т.д.)
  • специальные правила для ограничений общего типа (для предотвращения Nullable<Nullable<T>>)

Ответ 2

Nullable<T> работает, предоставляя два поля:

private bool hasValue;
internal T value;

Свойства работают от них. Если вы установите значение null, hasValue будет установлено в false.