基元类型为什么需要为null?考虑两个场景:

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。

最新文章

  1. 《我爱背单词》 Alpha版 发布说明
  2. 各种模板(part 1)
  3. [POJ1383]Labyrinth
  4. Solr搜索基础
  5. nodejs使用mongoose
  6. PHP抓取网络数据的6种常见方法
  7. 安装nagios出现的两个错误记录
  8. QT 串口通信 数据16进制发送
  9. Android开源项目分享
  10. Python+Tkinter 实现计算器功能
  11. kebab HDU - 2883(按时间段建点)
  12. Oracle的卸载过程步骤
  13. java反射之-性能优化
  14. Python3中urllib使用与源代码
  15. [Gradle] Gradle 构建 android 应用常见问题解决指南
  16. /etc/ssh/sshd_config 配置(ssh连接)
  17. ghj1222被坑记录[不持续更新]
  18. OpenStack Network --- introduction部分 阅读笔记
  19. C++结构体定义和C的区别
  20. 在MyEclipse中使用javadoc导出API文档详解

热门文章

  1. ubuntu server修改时区
  2. eclipse汉化安装
  3. 读取xml文件(可执行文件根目录debug)
  4. 大量字段表单在PHP便捷处理分享
  5. 怎样清除td和input之间空隙
  6. Codeforces Problem 598E - Chocolate Bar
  7. JavaScript 语言基础知识点总结
  8. IAR中 C语言位定义
  9. ANDROID_MARS学习笔记_S02_012_ANIMATION_利用AnimationListener在动画结束时删除或添加组件
  10. 水平/竖直居中在旧版Safari上的bug