惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 叶小钗
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
酷 壳 – CoolShell
酷 壳 – CoolShell
月光博客
月光博客
人人都是产品经理
人人都是产品经理
宝玉的分享
宝玉的分享
博客园 - 司徒正美
WordPress大学
WordPress大学
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
Vercel News
Vercel News
T
The Blog of Author Tim Ferriss
T
Tailwind CSS Blog
A
About on SuperTechFans
Apple Machine Learning Research
Apple Machine Learning Research
L
LangChain Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
Visual Studio Blog
S
SegmentFault 最新的问题
Google DeepMind News
Google DeepMind News
博客园 - 聂微东

博客园 - 彭灿明

SQL总结 .NET1.0升级至2.0十个问题 这两者需要映射到相同的服务器,从而无法打开项目的解决方法: 使用Server.Transfer,Response.Redirect注意点 Server.Transfer,Response.Redirect的区别 - 彭灿明 - 博客园 数据处理 分页语句 刘佳传的 xml节点删除修改 C# 3.0 新特性初步研究 在Asp.net中为图像加入版权信息 javascript 动态添加表格行 HTML结构化:实践DIV+CSS网页布局入门指南 BLOG技巧:用Javascript为你的Blog做一个计数器 .Net中常见问题及解决方法归类 Visual Studio 2005常用插件搜罗 微软开源官方网站上线! RSS在线阅读器 构造DATATABLE 数据库设计成功!
使用int?来确保值类型也可以为null
彭灿明 · 2015-08-27 · via 博客园 - 彭灿明

基元类型为什么需要为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类型表示为:

它也可以表示为:

语法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。