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

推荐订阅源

罗磊的独立博客
SecWiki News
SecWiki News
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
量子位
M
MIT News - Artificial intelligence
GbyAI
GbyAI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
TaoSecurity Blog
TaoSecurity Blog
博客园 - 【当耐特】
H
Heimdal Security Blog
腾讯CDC
The Last Watchdog
The Last Watchdog
Security Archives - TechRepublic
Security Archives - TechRepublic
Hacker News: Ask HN
Hacker News: Ask HN
S
Schneier on Security
Microsoft Security Blog
Microsoft Security Blog
WordPress大学
WordPress大学
博客园 - 司徒正美
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
Cybersecurity and Infrastructure Security Agency CISA
S
SegmentFault 最新的问题
大猫的无限游戏
大猫的无限游戏
Application and Cybersecurity Blog
Application and Cybersecurity Blog
F
Full Disclosure
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
Engineering at Meta
Engineering at Meta
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Threatpost
月光博客
月光博客
A
Arctic Wolf
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
雷峰网
雷峰网
T
Troy Hunt's Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The Cloudflare Blog
D
DataBreaches.Net
O
OpenAI News
L
LINUX DO - 最新话题
宝玉的分享
宝玉的分享
小众软件
小众软件
V
Vulnerabilities – Threatpost
A
About on SuperTechFans
人人都是产品经理
人人都是产品经理
T
The Exploit Database - CXSecurity.com
Martin Fowler
Martin Fowler
美团技术团队
P
Privacy International News Feed

博客园 - 吕艳阳

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