使用int?来确保值类型也可以为null
2015-08-27 08:03
609 查看
基元类型为什么需要为null?考虑两个场景:
1)数据库中一个int字段可以被设置为null。在C#中,值被取出来后,为了将它赋值给int类型,不得不首先判断一下它是否为null。如果将null直接赋值给int类型,会引发异常。
2)在一个分布式系统中,服务器需要接收并解析来自于客户端的数据。一个int型数据可能在传输过程中丢失或被篡改了,转型失败后应该保存为null值,而不是提供一个初始值。
类似的场景还有很多,所以从.NET 2.0开始,FCL中提供了一个额外的类型:可以为空的类型Nullable<T>。它是一个结构体,声明如下:
因为是结构体,所以只有值引用类型才可以作为“可以为空的类型”(引用类型本身就可以为null)。一个可以为空的int类型表示为:
它也可以表示为:
语法T?是Nullable<T>的简写,两者可以相互转换。可以为 null 的类型表示其基础值类型正常范围内的值再加上一个null值。例如,Nullable<Int32>,其值的范围为-2 147 483 648 ~ 2 147 483 647,再加上一个null值。
现在来看看可空类型和基元类型的互相转换。基元类型提供了其对应的可空类型的隐式转换,如下所示:
反过来,可空类型不可隐式转换为对应的基元类型,正确的转换形式如下:
但是,这段代码看上去是不是有点烦琐?所以,在阐述可空类型的时候,不得不提到??运算符。??最大的用处就是将可空类型的值赋值给对应的基元类型进行简化,上文代码的一个简化形式就是:
int j = i ?? 0;表示的意思是,如果i的HasValue为true,则将i的value赋值给j;否则,就给j赋值为0。
1)数据库中一个int字段可以被设置为null。在C#中,值被取出来后,为了将它赋值给int类型,不得不首先判断一下它是否为null。如果将null直接赋值给int类型,会引发异常。
2)在一个分布式系统中,服务器需要接收并解析来自于客户端的数据。一个int型数据可能在传输过程中丢失或被篡改了,转型失败后应该保存为null值,而不是提供一个初始值。
类似的场景还有很多,所以从.NET 2.0开始,FCL中提供了一个额外的类型:可以为空的类型Nullable<T>。它是一个结构体,声明如下:
[SerializableAttribute] public struct Nullable<T> where T : struct
因为是结构体,所以只有值引用类型才可以作为“可以为空的类型”(引用类型本身就可以为null)。一个可以为空的int类型表示为:
Nullable<int> i = null;
它也可以表示为:
int? i = null;
语法T?是Nullable<T>的简写,两者可以相互转换。可以为 null 的类型表示其基础值类型正常范围内的值再加上一个null值。例如,Nullable<Int32>,其值的范围为-2 147 483 648 ~ 2 147 483 647,再加上一个null值。
现在来看看可空类型和基元类型的互相转换。基元类型提供了其对应的可空类型的隐式转换,如下所示:
int? i = null;int j = 0;
i = j;
反过来,可空类型不可隐式转换为对应的基元类型,正确的转换形式如下:
int? i = 123; int j ; if (i.HasValue) { j = i.Value; } else { j = 0; }
但是,这段代码看上去是不是有点烦琐?所以,在阐述可空类型的时候,不得不提到??运算符。??最大的用处就是将可空类型的值赋值给对应的基元类型进行简化,上文代码的一个简化形式就是:
int? i = 123; int j = i ?? 0;
int j = i ?? 0;表示的意思是,如果i的HasValue为true,则将i的value赋值给j;否则,就给j赋值为0。
相关文章推荐
- 第22/24周 等待和I/O延迟统计
- 微软发布《Win10快捷键大全》:Win10桌面版快捷键功能介绍以及官方文档下载
- spring 中的 factory-method 属性
- 《Win10快捷键大全》官方文档下载
- Syntax error, type annotations are available only when source level is at least 1.8
- install ftp client on kail
- 201508025 课后命令练习总结
- rust raw pointer使用方法(3)
- UI:数据持久化
- 关于Oracle 产品(database,中间件等等)在vmware虚拟化环境中的支持情况
- 用selenium+webdriver爬取复旦图书馆信息记录
- php大力力 [027节] 被百度收录较好的几个视频网站示例
- CentOS 5.4下的Memcache安装步骤(Linux+Nginx+PHP+Memcached)
- mysql 库跟表 操作
- C语言流输入和输出函数
- [转载] 对象存储(2):OpenStack Swift——概念、架构与规模部署
- [转载] 文件系统vs对象存储——选型和趋势
- linux进程
- Java终极冒泡排序
- 软件考试