一、问题产生
在设计数据库时,数据库中的一列可能为null值,而这使我们在处理数据库中的数据时将变得困难,因为CLR没有办法将int类型表示成null值。
二、解决办法
1)在设计数据库时,设置列的默认值,避免列存入空值
2)CLR引入可空值类型
三、System.Nullable<T>结构定义的逻辑表示
[Serializable,StructLayout(LayoutKind.Sequential)]
public struct Nullable<T> where T : struct
{
private bool hasValue = false;//假定为null
internal T value = default(T);//若是值类型则为0,引用类型则为null
public Boolean HasValue
{
get { return hasValue; }
}
public T Value
{
get
{
if (!hasValue)
{
throw new InvalidOperationException("Nullable object must have a value.");
}
return value;
}
}
/// <summary>
/// 构造函数,设置对象初始状态
/// 值类型不需要显示调用
/// </summary>
/// <param name="value"></param>
public Nullable(T value)
{
this.value = value;
this.hasValue = true;
}
public T GetValueOrDefault()
{
return value;
}
public T GetValueOrDefault(T defaultValue)
{
if (!hasValue)
{
return defaultValue;
}
return value;
}
public override bool Equals(object obj)
{
if (!hasValue)
{
return obj == null;
}
if(obj==null)
{
return false;
}
return value.Equals(obj);
}
public override int GetHashCode()
{
if (!hasValue)
{
return 0;
}
return value.GetHashCode();
}
public override string ToString()
{
if (!hasValue)
{
return "";
}
return value.ToString();
}
/// <summary>
/// implicit 关键字用于声明隐式的用户定义类型转换运算符
/// 如果可以确保转换过程不会造成数据丢失,则可使用该关键字在用户定义类型和其他类型之间进
/// 行隐式转换。
/// </summary>
/// <param name="value"></param>
public static implicit operator Nullable<T>(T value)
{
return new Nullable<T>(value);
}
/// <summary>
/// explicit关键字声明了必须使用强制转换调用的用户定义的类型转换运算符。
/// </summary>
/// <param name="value"></param>
public static explicit operator T(Nullable<T> value)
{
return value.value;
}
}
四、通过可空值类型调用GetType