在我们自己的Jon Skeet的C# in depth中,他讨论了为值类型模拟'null'的3种方法:
提到可空类型使用第三种方法。可空类型究竟如何在引擎盖下工作?
答案 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); }
}
但是:差异很大:
EqualityComparer<T>
,Comparer<T>
等在.NET中运行)Nullable<Nullable<T>>
)答案 1 :(得分:4)
Nullable<T>
通过提供两个字段来工作:
private bool hasValue;
internal T value;
这些属性可以解决这些问题。如果将其设置为null
,则hasValue设置为false。