如何在.net中引入可空类型?

在我们自己的Jon Skeet的C#中 ,他讨论了模拟值类型的’null’的3种方法:

  • 魔术值(例如,最早可能的DateTime被视为’null’)
  • 引用类型包装器
  • 布尔标志

提到可空类型使用第三种方法。 可空类型究竟如何在引擎盖下工作?

    最终,它们只是一个带有bool标志的通用结构 – 除了特殊的拳击规则。 因为结构体(默认情况下)初始化为零,所以bool默认为false(无值):

    public struct Nullable 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 value) { return value.Value; } public static implicit operator Nullable(T value) { return new Nullable(value); } } 

    但是,有以下差异:

    • 特殊拳击规则(通常你不能这样做)
    • 用于比较null等的特殊C#规则
    • 在C#中“解除”运算符(在.NET中通过EqualityComparerComparer等)
    • generics类型约束的特殊规则(防止Nullable>

    Nullable通过提供两个字段来工作:

     private bool hasValue; internal T value; 

    这些属性起作用。 如果将其设置为null ,则hasValue设置为false。