В C# нашего собственного Jon Skeet подробно, он обсуждает эти 3 способа моделировать 'пустой указатель' для типов значения:
Упоминается, что nullable типы используют третий метод. Как точно nullable типы работают под капотом?
В конечном счете, это просто общая структура с флагом 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); }
}
Однако дополнительные различия:
EqualityComparer
, Comparer
и т.д.) Nullable >
) Nullable
работает, предоставляя два поля:
private bool hasValue;
internal T value;
Свойства работают на основе этих полей. Если вы установите для него значение null
, hasValue будет иметь значение false.