C# 可空类型的学习
null,这是一个空值,但是它在数据库和C#中表达的含义不一样。在数据库中,null表示的是不确定,比如null+5还是null,依旧是不确定的,在C#中,如果给一个字符串赋值null,表示这个字符串为空。另外,在数据库中,可以给Int32型赋值null,而在C#中,是不能给一个值类型赋空值的,那么如果来解决数据库和C#中,意义上的不兼容呢?这时,C#中引入了一个泛型 “可空类型”,在一般的赋值的情况下,还可以为null。
可以以下面的方式来定义一个可空的Int32.
int? a=null;
这样就可以将null赋值给一个int,同时也可以将a赋予一般的整数,例如:
int? b=20;
需要注意下面几点:
- 可控类型表示可以赋值为null的值类型变量,无法创建基于引用类型的可空类型,因为引用类型已经支持了可空类型,
- T?是System.Nullable<T>的简写,此处的T为值类型,可以互换。
- 可控类型和一般的值类型赋值方法相同。例如int? x=5; double? y=0.4;
- 它有2个重要的属性,可以使用 HasValue 和 Value 只读属性测试是否为空和检索值。如果此变量包含值,则HasValue属性返回True,或者此变量的值为空时,返回False。可空变量类型默认值将HasValue设置为false,未定义value.
- 可以使用 "??"运算符分配默认值,当前值为空的时候,将其赋予非空类型时使用默认值,例如:
int? x=null;
int y=x??-1;在x为null的前提下,可以使用??给y赋值。此外,null+一个非空依旧是null,例如:x = null;
x = x + 5;此时x依旧是null
可以参见下面的代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 可空数据类型
{
class Program
{
static void Main(string[] args)
{
int? x=null;
Console.WriteLine(x.HasValue);
if (x.HasValue)
{
Console.WriteLine("不是空值,且值为{0}",x.Value);
}
else
{
Console.WriteLine("是空值");
}
x = 20;
Console.WriteLine(x.HasValue);
if (x.HasValue)
{
Console.WriteLine("不是空值,且值为{0}", x.Value);
}
else
{
Console.WriteLine("是空值");
}
int y=(int)x;//将一个可空类型赋给一个一般的值类型时,需要显式转换,int y=x会报错。
}
}
}