как nullable типы реализованы под капотом в .NET?

В C# нашего собственного Jon Skeet подробно, он обсуждает эти 3 способа моделировать 'пустой указатель' для типов значения:

  • Волшебное значение (например, самый ранний DateTime взят, чтобы быть 'пустым'),
  • Обертка ссылочного типа
  • булев флаг

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

20
задан Gordon Gustafson 23 March 2010 в 21:36
поделиться

2 ответа

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

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); }
}

Однако дополнительные различия:

  • специальные правила упаковки (обычно вы не можете этого сделать)
  • специальные правила C # для сравнения с нулевым значением и т. д.
  • «поднял» операторы в C # (и в .NET через EqualityComparer , Comparer и т.д.)
  • специальные правила для общих ограничения типа (для предотвращения Nullable > )
35
ответ дан 29 November 2019 в 23:57
поделиться

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

private bool hasValue;
internal T value;

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

4
ответ дан 29 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: