偶然间发现C#类型还有一种特殊的操作,就是在类型后面加上问号。这种类型是可为空的类型。
int? a=null; //可为空的int类型
a=10;
float? b=null;//可为空的float类型
b=12.1f;
double? c=null;//可为空的double类型
c=100.059;
//... ...
//string 类型没有 string?的形式
//如何使用呢?
int age = a + 10;//这个会报错的
//正确使用方法如下
if(a != null )
int age1 = a.Value + 10;//
其实这种类型是非常有用的,因为现实中就是会有这样的需求,对于某些变量可以为空也可以有数值,空值null表示这个变量代表的参数不存在(而不想用一个默认值0来表示)。
在引入可为空的类型之后,我们会遇到比较的问题。这个需要特别留意的,如果int? a=null, int? b=3, 在你比较的大小的时候可能会与您的预期不一致。
int? a=null;
int? b=null;
//结果为true: 表示 null == null
if( a==b )
{
Console.WriteLine("true“);
}
else
{
Console.WriteLine("false“);
}
a=3;
//结果为false: 表示 3不大于 null
if( a > b )
{
Console.WriteLine("true“);
}
else
{
Console.WriteLine("false“);
}
//结果为false: 表示 3 也不小于 null
//其实数值和null之间是不可以比较的
if( a < b )
{
Console.WriteLine("true“);
}
else
{
Console.WriteLine("false“);
}
b=1;
//结果为true: 表示 3>1
if( a > b )
{
Console.WriteLine("true“);
}
else
{
Console.WriteLine("false“);
}
这时候你可能想到比较之前可以先检查一下是否为空null。
还有一种情况,比如我们想比较 a和100的大小,期望a=null或者a.Value<100时都能返回false, 当a.Value>=100时返回true,可以这样做
int? a = null;
//... ...
//其他计算和赋值
//... ...
//这个在a赋值了,且值大于100时返回true
if(!(a < null))
{
Console.WriteLine("true");
}