建议5: 使用int?来确保值类型也可以为null

转载 2016年08月29日 14:05:59

建议5: 使用int?来确保值类型也可以为null

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

1)数据库中一个int字段可以被设置为null。在C#中,值被取出来后,为了将它赋值给int类型,不得不首先判断一下它是否为null。如果将null直接赋值给int类型,会引发异常。

2)在一个分布式系统中,服务器需要接收并解析来自于客户端的数据。一个int型数据可能在传输过程中丢失或被篡改了,转型失败后应该保存为null值,而不是提供一个初始值。

类似的场景还有很多,所以从.NET 2.0开始,FCL中提供了一个额外的类型:可以为空的类型Nullable<T>。它是一个结构体,声明如下:

  1. [SerializableAttribute]  
  2. public struct Nullable<T> where T : struct 

因为是结构体,所以只有值引用类型才可以作为“可以为空的类型”(引用类型本身就可以为null)。一个可以为空的int类型表示为:

  1. Nullable<int> i = null

它也可以表示为:

  1. int? i = null

语法T?是Nullable<T>的简写,两者可以相互转换。可以为 null 的类型表示其基础值类型正常范围内的值再加上一个null值。例如,Nullable<Int32>,其值的范围为-2 147 483 648 ~ 2 147 483 647,再加上一个null值。

现在来看看可空类型和基元类型的互相转换。基元类型提供了其对应的可空类型的隐式转换,如下所示:

  1. int? i = null;  
  2. int j = 0;  
  3. i = j

反过来,可空类型不可隐式转换为对应的基元类型,正确的转换形式如下:
  1. int? i = 123;  
  2. int j ;  
  3. if (i.HasValue)  
  4. {  
  5.     j = i.Value;  
  6. }  
  7. else  
  8. {  
  9.     j = 0;  

但是,这段代码看上去是不是有点烦琐?所以,在阐述可空类型的时候,不得不提到??运算符。??最大的用处就是将可空类型的值赋值给对应的基元类型进行简化,上文代码的一个简化形式就是:
  1. int? i = 123;  
  2. int j = i ?? 0; 

int j = i ?? 0;表示的意思是,如果i的HasValue为true,则将i的value赋值给j;否则,就给j赋值为0。

转自:《编写高质量代码改善C#程序的157个建议》陆敏技

mysql字段类型为int默认null,插入却显示0的解决办法,参考php代码

  • hai7425
  • hai7425
  • 2016年06月30日 16:49
  • 2329

可空类型"int?" 解决: 【数据库里的int类型可以为null,而在c#里int类型不能为Nul】的问题

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 可空数...
  • Fanbin168
  • Fanbin168
  • 2014年03月15日 11:32
  • 4241

int(4)和int(5)是否有区别?

MySQL类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列...
  • u012841191
  • u012841191
  • 2013年12月10日 10:59
  • 3275

一行代码解决:服务器返回null导致应用崩溃

背景1:是否有这样一种感受,你的应用会崩溃,查看崩溃日志或者调试发现后台返回的数据字段里面有null,这个null居然还是导致应用崩溃的“元凶”。 背景2:服务器返回的字段名和不一致,如果m...
  • moxi_wang
  • moxi_wang
  • 2016年08月12日 09:24
  • 590

无法确定表达式的类型,因为<null>和int之间没有隐式转换

遇到过好多次的问题了,因为一直忙着码代码,所以没时间去彻底的研究这个问题。 今天实在反了,就想想了这个问题 下面是代码。 首先是一个实体类,有个 WinningType 字段类型是 int? 的可...
  • helianus
  • helianus
  • 2016年05月10日 00:31
  • 2338

mysql常见问答

1.mysam与innodb区别:  InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处...
  • bohu83
  • bohu83
  • 2016年04月17日 11:05
  • 266

关于int和Integer互转的问题

Integer转成int这个在转换的过程中会调用Integer的静态方法valueOf()方法。 源码如下:public static Integer valueOf(int i) { ...
  • fan2012huan
  • fan2012huan
  • 2016年11月19日 13:24
  • 1866

Mysql开发规范

一、表设计  1.采用ER模型,首先遵循范式设计,再根据实际需要进行反规范化设计。  2.库名、表名、字段名必须使用小写字母,“_”分割(TICKET库除外)。  3.库名、表名、字...
  • qq_29923439
  • qq_29923439
  • 2017年05月18日 09:52
  • 135

postgresql将表中的字段由varchar类型改为int类型

因业务需要,遂将表中sort_num字段从varchar类型改为int类型,但是在修改中却发现了如下问题: 错误: 字段 “sort_num” 不能自动转换成类型 integer HINT: ...
  • u011008029
  • u011008029
  • 2017年06月01日 17:28
  • 2234

6.C#:在C#中使用Nullable类型(给整型赋null值的方法)

本文来自:http://blog.sina.com.cn/s/blog_43e42bde0100gbvn.html 在C#1.x的版本中,一个值类型变量是不可以被赋予null值的,否则会产生异常。...
  • xushaozhang
  • xushaozhang
  • 2017年01月13日 10:11
  • 2307
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:建议5: 使用int?来确保值类型也可以为null
举报原因:
原因补充:

(最多只允许输入30个字)