Nullable<T>、Nullable、null、?修饰符的区别

这章我们讨论一下Nullable<T>、Nullable、null、?修饰符的区别

原创文章

Nullable<T>的前世今生

讨论它们之前,我们有必要讨论一下Nullable<T>的前世今生,目的也是为了让我们更好地了解他们的区别,加深印象。
在C#2以前,有一个问题经常会困扰我们,相信大部分人都想过此问题。
在数据库中,比如设置一个表如下(电脑表Computer)

字段名类型是否允许空值
ColorvarcharY
AgeintN
CpuSpeedintY
CreateDateDateTimeY
PowerintY

对于Age是int类型,不能允许空值还好说,因为插入数据库时会提示Age要有值才能插入。对于CpuSpeed、CreateDate、Power都是值类型,在程序中不能设置空值,比如int CpuSpeed=null,是不允许的。
那么我们以前是怎么解决这种问题的存在呢?
答:'给个默认值=空值'
比如,CreateDate=DateTime.MinValue。表示空值。
这种做法虽然开起来不错,但是显然是在程序设计时要规定好的,容易让人困扰。当新的程序员要接手你的代码时,表示很危险。
那么C#怎么解决这种问题的存在呢?答案就在C#2中引入了Nullable<T>
对于上面的CpuSpeed、CreateDate、Power我们可以在C#中这样来定义:

public Nullable<int> CpuSpeed;
public Nullable<DateTime> CreateDate;
public Nullable<int>Power;

这样,我们就很好的与数据库那边打交道了。

Nullable<T>、Nullable、null、?修饰符的区别

  • Nullable<T>其实就等于?修饰符。比如上面的 public Nullable<int> CpuSpeed;等价于public int? CpuSpeed;
  • 修饰符?是Nullable<T>的简写,请参考上面
  • Nullable<T>是一个结构structs,Nullable是一个静态类。他们结构类型上已经不同。也就是说Nullable<T>是值类型,Nullable是引用类型。
    可以看到源代码:

public struct Nullable<T> where T : struct
public static class Nullable

  • Nullable其实显得有点多余,因为它更多意义上是修饰了Nullable<T>的用法。但是Nullable实现了Nullable<T>很多实用功能。
  • null是表示空值,与Nullable<T>、Nullable没有特别的关联。

null、Nullable<T>

我们有必要说一下null、Nullable<T>的关联。 我们都知道,当比较一个值类型==null时,永远都为false,因为null '一般表示引用类型为null'。 用例子来说明一下吧,创建一个电脑Entity类:

public class Computer
{
    public string Color;
    public int Age;
    public int? CpuSpeed;
    public DateTime? CreateDate; 
    public int? Power;
}
我们来试试比较一下null、Nullable<T>的值是否相等。
第一个需要比较的是,如果Nullable<T>有值时,是否与null的判断,如下:

Computer computer1 = new Computer();
computer1.CpuSpeed = new Nullable();
Console.WriteLine("new Nullable()==new Nullable() " + (computer1.CpuSpeed == new Nullable()));
Console.WriteLine("new Nullable()==null " + (computer1.CpuSpeed == null));

我们首先想想,上面会输出什么呢?

new Nullable<int>()==new Nullable<int>() 肯定是true啦,不用说
new Nullable<int>()==null 按照通常的理解,应该是false,但是这里确实输出true。
为什么呢?哈哈哈,这有点意思呢,我们来看看Nullable<T>的源代码吧:

 public override bool Equals(object other) {
        if (!hasValue) return other == null;
        if (other == null) return false;
        return value.Equals(other);
    }
看第一行,如果没有值并且other为null就返回true。所以我们就明白了为什么新建一个没有值的Nullable<T>时等于null

到此解析结束了。 请转载本文注明转载处与作者。

 

 

可以关注本人的公众号,多年经验的原创文章共享给大家。

posted on 2017-07-16 12:37 alun-chen 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/alunchen/p/7190230.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值