可空值类型

一、问题产生

     在设计数据库时,数据库中的一列可能为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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值