C#中的?和?? 可空类型和空值判断

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mango_love/article/details/84558971

我们先看一个例子,在数据库里面有些数据比如说int类型datetime类型是非必填的,所以有的时候这个类型不需要给它一个初始值,直接是null,那么对应c#里面的数据类型如果是int类型我们需要它是一个null怎么办呢?

int i;
Console.Write(i);//提示这个i没有赋值不可以使用
i = null;//提示无法把这个null转换成int类型

上面这两种方式都不可以实现这个需求,所以微软也挺人性化的给我们提供了一个名为可空类型的新类型,写法上就是类型后面加?,比如可空类型的int就写成int?,?在这里就是一个语法糖,编译器在编译的时候把他编译成Nullable<T>,T就是这里的类型。

 int? i=null;
 Nullable<int> a = null;
 Console.Write(i==a);//结果为True

当然这里的可空类型也存在着拆箱与装箱,这里来看简单的例子

int? i=1;
object obj = i;
Console.Write(obj.GetType());

此时输出结果为:

System.Int32

接下来分享一下一个有趣事情,我在看微软的文档的时候发现可空类型有一个异常:System.NullReferenceException

明明是可空类型,为什么还会有空引用的错误呢?下面我们来引发一下这个异常

int? a = null;
Console.WriteLine(a.GetType());

这里我们可以看出,可空类型的null是一个值类型的空而不是引用类型的null,所以,在我们需要知道它的类型的时候会把这个类型拆箱,但是int类型是没有null的,所以我们在查看它的类型的时候就抛出了这个异常。

下面我们来看看??。空合并操作符,使用的时候就是两个问号。什么个意思呢?我们先看看下面的例子

int? a = null;
Console.WriteLine(a ?? 2);
int? b = 1;
Console.WriteLine(b ?? 2);

string str1 = "";
Console.WriteLine("str1={0}",str1 ?? "为空吗");
string str2 = string.Empty;
Console.WriteLine("str2={0}", str2 ?? "为空吗");
string str3 = null;
Console.WriteLine("str3={0}", str3 ?? "为空吗");
string str4 = "不为空";
Console.WriteLine("str4={0}", str4 ?? "为空吗");

结果:

2
1
str1=
str2=
str3=为空吗
str4=不为空

有上面的例子可以得出,左边为null吗?为null?选右边。不为null?选左边。这里不管是""还是String.Empty都不是null,所以有些时候我们可以省略很多代码

猜你喜欢

转载自blog.csdn.net/mango_love/article/details/84558971
今日推荐