C#基础知识基础知识 全面解析可空类型全面解析可空类型
C# 2.0 中还引入了可空类型,可空类型也是值类型,只是可空类型是包括null的值类型的,下面就介绍下C#2.0中对可空类型的支
持具体有哪些内容
引言:引言:
C# 2.0 中还引入了可空类型,可空类型也是值类型,只是可空类型是包括null的值类型的,下面就介绍下C#2.0中对可空类型的支持具体有哪
些内容(最近一直都在思考如何来分享这篇文章的,因为刚开始觉得可空类型使用过程中比较简单,觉得没有讲的必要,但是考虑到这个系列的完整性,
决定还是唠叨下吧,希望对一些不熟悉的人有帮助)。
一、为什么会有可空类型一、为什么会有可空类型
如果朋友们看了我之前的分享,对于这一部分都不会陌生,因为我一般介绍C#特性经常会以这样的方式开头的, 因为每个特性都是有它出现的原
因的(有一句佛语这是这么讲的:万事皆有因,有因必有果),首先来说说这个因的(果当然是新增加了可空类型这个新特性了。),当我们在设计数据库
的时候,我们可以设置数据库字段允许为null值,如果数据库字段是日期等这样在C#语言是值类型时,当我们把数据库表映射一个对象时,此时
Datetime类型在C# 语言中是不能为null的,如果这样就会与数据库的设计有所冲突,这样开发人员就会有这样的需求了——值类型能不能也为可
空类型的?同时微软也看出了用户有这样的需求,所以微软在C# 2.0中就新增加了一种类型——可空类型,即包含null值的值类型,这个也就是我
理解的因了,介绍完因之后,当然就是好好唠叨下可空类型是个什么东西的了?
二、可空类型的介绍二、可空类型的介绍
可空类型也是值类型,只是它是包含null的一个值类型。我们可以像下面这样表示可空类型(相信大家都不陌生):
复制代码 代码如下:
int? nullable = null;
上面代码 int? 就是可空的int类型(有人可能会这样的疑问的, 如果在C#1中我硬要让一个值类型为一个可空类型怎么办到呢?当然这个在C#1之
前也是有可以办到的,只是会相当麻烦,对于这个如果有兴趣的朋友可以去刨下根),然而其实 "?"这个修饰符只是C#提供的一个语法糖(所谓语法
糖,就是C#提供的一种方便的形式,其实肯定没有int? 这个类型,这个int?编译器认为的就是Nullable<int>类型,即可空类型),其实真真C# 2.0提供
的可空类型是——Nullable<T>(这个T就是上专题介绍的泛型参数,其中T只能为值类型,因为从可空类型的定义为:public struct Nullable<T> where
T : struct)和Nullable。下面给出一段代码来介绍可空类型的使用:
复制代码 代码如下:
namespace 可空类型Demo
{
class Program
{
static void Main(string[] args)
{
// 下面代码也可以这样子定义int? value=1;
Nullable<int> value = 1;
Console.WriteLine("可空类型有值的输出情况:");
Display(value);
Console.WriteLine();
Console.WriteLine();
value = new Nullable<int>();
Console.WriteLine("可空类型没有值的输出情况:");
Display(value);
Console.Read();
}
// 输出方法,演示可空类型中的方法和属性的使用
private static void Display(int? nullable)
{
// HasValue 属性代表指示可空对象是否有值
// 在使用Value属性时必须先判断可空类型是否有值,
// 如果可空类型对象的HasValue返回false时,将会引发InvalidOperationException异常
Console.WriteLine("可空类型是否有值:{0}", nullable.HasValue);
if (nullable.HasValue)
{
Console.WriteLine("值为: {0}", nullable.Value);
}
// GetValueOrDefault(代表如果可空对象有值,就用它的值返回,如果可空对象不包含值时,使用默认值0返回)相当与下面的语句
// if (!nullable.HasValue)
// {
// result = d.Value;
// }
Console.WriteLine("GetValueorDefault():{0}", nullable.GetValueOrDefault());
// GetValueOrDefault(T)方法代表如果 HasValue 属性为 true,则为 Value 属性的值;否则为 defaultValue 参数值,即2。
Console.WriteLine("GetValueorDefalut重载方法使用:{0}", nullable.GetValueOrDefault(2));