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

时间:2010-03-23 21:36:29

标签: c# .net nullable

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

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

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

2 个答案:

答案 0 :(得分:35)

最终,它们只是一个带有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); }
}

但是:差异很大:

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

答案 1 :(得分:4)

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

private bool hasValue;
internal T value;

这些属性可以解决这些问题。如果将其设置为null,则hasValue设置为false。