可空类型Nullable<T>是.NET Framework 2.0中新增的类型,用它声明的值类型,除了存值之外,还可以表示为null,即该类型的变量可以为空。

下面是Nullable结构的定义:

 1namespace System
 2{
 3    [Serializable]
 4    public struct Nullable<T> where T : struct
 5    {
 6        public Nullable( T value );
 7
 8        public static explicit operator T( T? value );
 9        public static implicit operator T?( T value );
10
11        public bool HasValue { get; }
12      
13        public T Value { get; }
14
15        public override bool Equals( object other );
16        
17        public override int GetHashCode();
18        
19        public T GetValueOrDefault();
20        
21        public T GetValueOrDefault( T defaultValue );
22        
23        public override string ToString();
24    }
25}

从定义可以看出,Nullable<T>结构中的类型参数T必须是一个结构,这就意味着Nullable<T>只支持将值类型用作可空类型,因为引用类型本身就是可空的。另外还可以看出,将值类型(如int)可以隐式地转换为可空类型,而可空类型转换为值类型则要进行显式转换。Nullable<T>还有两个重要的属性:HasValue和Value,前者判断变量内是值还是null,并返回一个布尔值,后者用于取出相应类型的值。很明显如何可空类型的变量此时保存的是null,那么使用Value属性会产生异常(InvalidOperationException)。

使用Nullable<T>声明一个存储int值的可空类型变量,可以这样写:

1Nullable<int> a = null;

这样变量a既可以存储整型值,也可以存储null了。在C#中还有简化的写法:

int? a = null;

这样用起来更加方便。

有了可空类型,那么在从数据库中取值时,如果碰到了NULL值,语句能简化一些,例如,如果不使用可空类型,那么语句可能会这样写:

1if (dataReader["SSN"] == DBNull.Value)
2    ssn = -1; // NULL 用 -1 代替
3else
4    ssn = Convert.ToInt64(dataReader["SSN"]);

因为传统的值类型不能为null,所以必须为数据库中的NULL值提供一个无效的值,有时候这个无效的值并不好找。而使用可空类型,变量可以为null,那么我们就可以这样写:

1ssn = dataReader["SSN"] == DBNull.Value ? (long?)null : Convert.ToInt64(dataReader["SSN"]);

在访问可空类型变量中的值时,最好先检查一下HasValue属性,判断一下是否有值,以避免异常发生,例如:

1if (ssn.HasValue)
2{
3    long ssn = (long)ssn; // 或 ssn.Value
4    Console.WriteLine("SSN = {0}", ssn);
5}

总之,适当地使用可空类型,能够简化代码,减少一些麻烦。

参考文档:

  • Working with Nullable Types in C#
  • MSDN

转载于:https://www.cnblogs.com/netatomy/archive/2007/12/29/1020457.html

使用可空类型(Nullable)相关推荐

  1. 可空类型Nullable

    Nullable类型: 值类型变量默认为0,不可空,为了使它可空,出现了Nullable类型,类型前面加? 变为引用类型 值类型是没有null值的,比如int,DateTime,它们都有默认值.举个例 ...

  2. 了解下C# 可空类型(Nullable)

    C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值. C# 单问号 ? 与 双问号 ?? ? 单问号用于对 int ...

  3. C#可空类型(Nullable Types)

    在讨论可空类型前,先回顾一下.NET 对于类型的定义:  ".NET 中类型分为值类型和引用类型,值类型不能为空,引用类型可为空";  在这样的前提下,所有值类型都赋予了一个初始值 ...

  4. 在C#2.0中使用Nullable可空类型(转帖)

    在C#2.0中使用Nullable可空类型 在C#1.x的版本中,一个值类型变量是不可以被赋予null值的,否则会产生异常.在C#2.0中,微软提供了Nullable类型,允许用它定义包含null值( ...

  5. 分析 C# 2.0 新特性 -- 空类型(Nullable Types)

    分析 C# 2.0 新特性  -- 空类型(Nullable Types) 在讨论C# 2.0 空类型前,先回顾一下.NET 1.0和.NET 1.1对于类型有下面这样的定义: ".NET  ...

  6. C#基础入门教程-可空类型(Nullable)

    目录 C#可空类型(Nullable) C# 可空类型(Nullable) 实例练习 Null 合并运算符( ?? ) 实例练习 C#可空类型(Nullable) ? : 单问号用于对 int,dou ...

  7. [C#基础知识系列]专题十:全面解析可空类型

    引言: C# 2.0 中还引入了可空类型,可空类型也是值类型,只是可空类型是包括null的值类型的,下面就介绍下C#2.0中对可空类型的支持具体有哪些内容(最近一直都在思考如何来分享这篇文章的,因为刚 ...

  8. 【Kotlin】变量简介 ( 可空类型 | lateinit | 初始化判定 | 非空类型 | !! 与 ? 修饰符 | ?= ?. ?: 运算符 | 抽象属性变量)

    文章目录 I . Kotlin 变量总结 II . Kotlin 非空变量 III . 非空变量不能赋空 IV . lateinit 关键字 V . lateinit 初始化判定 VI . Kotli ...

  9. C#学习笔记(六):可空类型、匿名方法和迭代器

    可空类型 为啥要引入可空类型? 在数据库中,字段是可以为null值的,那么在C#中为了方便的操作数据库的值,微软引入了可空类型. 声明可空类型 我们可以使用两种方法声明一个可空类型: 1 Nullab ...

最新文章

  1. BlockChain:Scene application区块链场景应用集合
  2. mysql query profile_MySQL Query Profile
  3. ITK:计算和显示图像的梯度
  4. hadoop2.x的安装
  5. SAP S/4HANA里KPI tile的一个具体例子
  6. 12.多媒体和超链接标签及其应用实例
  7. LeetCode 1785. 构成特定和需要添加的最少元素(贪心)
  8. linux下如何bash文件,Linux系统的文件管理命令及bash的相关工作特性
  9. 信贷产品的架构设计总览
  10. 理解*arg 、**kwargs
  11. 跨域产生的原因和解决方法_针织面料染色折痕/产生的原因及解决方法
  12. Eclipse安装aptana
  13. 如何自学python知乎-学习Python价格多少?如何学习好?老男孩IT教育
  14. 爬取小说《重生之狂暴火法》 1~140章
  15. error C2440: “<function-style-cast>”: 无法从“IplImage *”转换为“cv::Mat”
  16. PTA题---求两个有序序列中位数所体现的思想。
  17. 腾讯云如何搭建PHP环境?
  18. PS——图像处理知识点
  19. css省略号方法及不显示问题修复
  20. 如何用将top命令的结果写入txt?

热门文章

  1. SSTI简单总结和例题
  2. 如何清洁电脑键盘上的灰尘?
  3. pytest之fixture参数化
  4. Nginx缓存以及反向代理缓存设置
  5. Retrofit缓存设置,处理UnKnownHostException异常信息
  6. 基于FPGA Uart串口通信实验
  7. 如何延长电脑硬盘的使用寿命?
  8. C语言中变量声明和变量定义的区别
  9. 13、JPA乐观锁和悲观锁
  10. suse linux 无网关,SUSE 网关设置