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

推荐订阅源

Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
J
Java Code Geeks
L
LangChain Blog
V
V2EX
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
博客园 - Franky
Microsoft Azure Blog
Microsoft Azure Blog
Jina AI
Jina AI
Blog — PlanetScale
Blog — PlanetScale
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
博客园 - 司徒正美
B
Blog
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
Engineering at Meta
Engineering at Meta
MyScale Blog
MyScale Blog
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog

博客园 - 吕艳阳

asp.net 重新启动应用程序 eWebEditor在线文本编辑器最新版(V4.6) 用DataReader 分页与几种传统的分页方法的比较 CodeSmith实体类模板 Oracle中取余的方法 (转)asp.net自定义控件(数据绑定) (转)asp.net控件设计时支持(3) javascript事件列表解说 返回数据库内所有表的字段 网线水晶头的接法 Access密码破解工具 简单介绍一下asp.net中DataGrid的使用(视频教程) Asp.net中文件的上传和下载(视频教程) 如何在asp中,使用vb来开发dll组件 (提供视频下载) 操作系统常用技巧 Oracle9i 用户登录存储过程 Oracle 冷备份操作 Oralce9i 获取单个字段的值 Oracle 9i 返回一个记录集的方法
(转)C#新特性:可空类型
吕艳阳 · 2008-09-24 · via 博客园 - 吕艳阳

可空类型可以对值类型的数据进行定义

1.定义:int? myNullableInt = 1;

你可以看到,这两个变量看上去好像是一样的。但是,可空类型的版本是非常不同的。可空的版本事实上是一个结构,它将值类型和一个标记该值是否为空的标志位结合在一起。一个可空类型有两个公共可读的属性,HasValue和value。如果存储了一个值那么HasValue这个布尔型变量就为true。否则,如果变量是空值就是false。如果HasValue是true,你可以获取这个变量的值。如下有两个对可空变量的有效赋值:
double? myDouble = 3.1415926;
double? myOtherDouble = null;

2.使用

可空类型可以像普通值类型一样的使用。事实上,可以使用内建的隐式转换来转换相同类型的可空变量和非可空变量。这意味着你可以在一个标准整型和可空整型之间相互转换:
int? nFirst = null;
int Second = 2;

nFirst = Second; // 有效
nFirst = 123; // 有效
Second = nFirst; // 同样有效

nFirst = null; // 有效
Second = nFirst; // 例外,后者是非空类型

在以上的语句里,你可以看到如果可空变量不包含空值的话是可以和非可空变量交换值的。如果它是一个空值,那么就会抛出例外。为了防止例外,你可以使用可空变量的HasValue属性:

if (nFirst.HasValue) Second = nFirst;

3.使用可空类型的操作符

int ValA = 10;
int? ValB = 3;

int? ValC = ValA * ValB;

在ValC里存储了什么?ValC中存储了30。标准操作符被扩展使得它们能够处理可空类型。考虑到如下的变化:

int ValA = 10;
int? ValB = null;

int? ValC = ValA * ValB;

ValC这次值为多少?ValC为空。无论哪个操作数为空,提升的操作符的结果为空。即使进行加法或减法,结果也为空。

  如果ValC不为可空类型呢?如下的代码会有什么样的结果?
int ValA = 10;
int? ValB = null;

int ValC = ValA * ValB; // ValC 不为可空类型

代码将会抛出一个异常。ValA*ValB结果为空,但是不能赋值为非可空类型,这将会导致程序异常的抛出。

4.比较

比较将会和数学计算操作类似的方式处理。比较的操作数将同时被提升为可空的。这样就可以比较了,如果某个操作数为空,那么比较结果为false。

  如果对比是否相等,两个同为空的变量将被认为是相等的。一个空变量和其他任意值的变量相比的结果是不相等。下面是一些比较的例子:

int abc = 123;
int xyz = 890;
int? def = null;
int? uvw = 123;

Comparison Result
abc == xyz // false
abc == def // false
def == null // true
abc == uvw // true
uvw == null // false
uvw != null // true

  在所有的比较中,结果都是布尔型值true或者false。在做大小比较的时候,如果操作数的任意一个或者都是空值,那么结果返回的是false。如下展示了一些例子:

Comparison Result
abc > uvw // false, they are equal
abc < def // false, def is null
uvw < def // false, because def is null
def > null // false, because right side is null
uvw > null // false, because right side is null


  

可空性的移去

  C#在新版本中加入了一个新的操作符,它被称为空接合操作符,使用如下的格式:

returnValue = first second;

  这样,如果first不为空,那么它的值将返回作为returnValue的值。如果first为空,那么second的值将被返回。注意:returnValue可以为可空变量或者非可空变量。

  如果你希望可空变量的值到一个非可空的版本,你可以这样做:

int? ValA= 123;
int? ValB = null;

int NewVarA = ValA ?? -1;
int NewVarB = ValB ?? -1;

  NewVarA的值将会为123因为ValA不是空值。NewVarb的值是-1因为ValB是空值。你看一看到,这里你将可以将变量从一个空值转化成一个缺省值。这里缺省值是-1。

  结束语

  总得来说,最新的C#允许一个可空类型的存在。语言内部建立了对可空类型的处理机制。可空类型使得数据库记录和其他可选信息更加的容易处理。

  可空类型是C# ECMA-334版本的一个特性。你需要一个支持这个版本的C#的编译器。Visual Studio 2005支持这个版本。

本文转自 http://tech.sina.com.cn/s/2006-02-13/1045839111.shtml