建议5: 使用int?来确保值类型也可以为null
来源:互联网 发布:信阳烟草网络 编辑:程序博客网 时间:2024/05/01 11:45
建议5: 使用int?来确保值类型也可以为null
基元类型为什么需要为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。
转自:《编写高质量代码改善C#程序的157个建议》陆敏技
0 0
- 建议5: 使用int?来确保值类型也可以为null
- 建议5 使用int?来确保值类型也可以为null
- 使用 int? 来确保值类型也可为null
- Tip5 使用Int?来确保值类型也可用为null
- C#可空类型,int可以为null.
- C#使用可以为null的类型
- 可以为null的值类型
- int?类型可为null
- 5、可以为空的值类型int?
- 可空类型"int?" 解决: 【数据库里的int类型可以为null,而在c#里int类型不能为Nul】的问题
- int,float等基础类型终于可以赋为null了
- int *p = NULL; free(p);这样也可以
- C#编程:可以为 null 的类型
- 匹夫细说C#:可以为null的值类型,详解可空值类型
- 改善C#程序的建议5:引用类型赋值为null与加速垃圾回收
- 改善C#程序的建议5:引用类型赋值为null与加速垃圾回收
- 改善C#程序的建议5:引用类型赋值为null与加速垃圾回收
- 使用MyBatis查询 返回类型为int,但是当查询结果为空NULL,报异常的解决方法
- JAVA中堆和栈的区别
- Python字符串
- struts2中的类型转换
- 重点:货车帮
- 一些开源框架的使用
- 建议5: 使用int?来确保值类型也可以为null
- 网址
- printk_time
- 167. Two Sum II - Input array is sorted
- JavaSE Swing Menu
- 大数据Spark“蘑菇云”行动-第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏
- awk按照某个字段排列,求某个列的最大值最小值
- 中文分词比较困难的句子
- *浙大PAT甲级 1081