.NET 可空值类型
Microsoft在CLR中引入了可空值类型(nullable value type)的概念。
FCL中定义System.Nullable<T>类如下:
[Serializable,StructLayout(LayoutKind.Sequential)]
public struct Nullable<T> where T: struct {
private Boolean hasValue=false;
internal T value=default(T);
………………(略)
}
一、 C#对可空值类型的支持
- Nullable<T>是值类型,实例仍然是”轻量级”的。即仍然可以在栈上,实例的大小就是原始值类型+Boolean字段大小。
- Int32?等价于Nullable<Int32>。
- 一元操作符(++,+,-,--,!,~) 操作数是null,结果就是null。
- 二元操作符(+,-,*,/,%,&,|,^,<<,>>)两个操作数中任何一个是null,结果就是null。
Int32? a=5;
Int32? b=null;
//一元操作符
a++;//6;
b=-b; //null;
//二元操作符
a=a+3;//a=9;
b=b*3;//b=null;
- 相等性操作符(==,!=)两个操作数都是null,两者相等;一个操作数是null这两者不相等。两个操作数都不是null,就比较值来判断是否相等。
- 关系操作符(<,>,<=,>=)两个操作数任何一个是null,结果就是false。两个操作数都不是null,就比较值。
二、C#的空结合操作符
- 空结合操作符(null-coalescing operator),即??操作符。
- 它要获取两个操作数,加入左边的操作数不为null,就返回这个操作数的值。如果左边的操作数为null,就返回右边的操作数的值。
- 利用空结合操作符,可以方便地变量的默认值。它既能拥有引用类型,也能用于可空值类型。
- ??在复合情形中更好用,如:
String s= DoThing1() ?? DoThing2() ?? ”NoThing!”;
三、可空值的装箱、拆箱与调用GetType
- 当CLR对一个Nullable<T>实例进行装箱时,会检查它是否为null。
a) 若是,CLR不实际装箱,并返回null值;
b) 若不为null,CLR从可空类型中取出值,并对其进行装箱。
- CLR允许将一个已装箱的值类型T拆箱为一个T或者一个Nullable<T>。
若已装箱的值类型的引用是null,且要拆箱为一个Nullable<T>,那么CLR会将Nullable<T>的值设为null。
- Int32? x=5;
Console.WriteLine(x.GetType());//输出System.Int32,而非System.Nullable<Int32>。
.NET 可空值类型的更多相关文章
- 匹夫细说C#:可以为null的值类型,详解可空值类型
首先祝大家中秋佳节快乐~ 0x00 前言 众所周知的一点是C#语言是一种强调类型的语言,而C#作为Unity3D中的游戏脚本主流语言,在我们的开发工作中能够驾驭好它的这个特点便十分重要.事实上,怎么强 ...
- Util应用程序框架公共操作类(十):可空值类型扩展
当你使用可空的值类型时,你会发现取值很不方便,比如Guid? obj,你要从obj中获取值,可以使用Value属性obj. Value,但obj可能为null,这时候就会抛出一个异常. 可空值类型提供 ...
- C#中的可空值类型
C# 不允许把 null 赋给一个值类型的数据.在 C# 中,以下语句是非法的: int a = null; // 非法 但是,利用 C# 定义的一个修饰符,可将一个变量声明为一个可空(null ...
- 【C#进阶系列】19 可空值类型
可空值类型,正如字面意义上的,是可以为NULL的值类型. 这个东西存在的意义可以解决比如数据库的的Int可以为NUll的情况,使得处理数据库数据更简单. 实际上可空值类型就是Nullable<T ...
- CLR via C#(14)-可空值类型,关于?和??的故事
我们都知道,值类型是不能为Null的,但是在实际应用中有些情形却需要将值类型置为null.因此,CLR中引用了可空值类型的用法.今天的文章中见到最多的符号估计就是?了吧. ?——初识可空值类型 1. ...
- [CLR via C#]19. 可空值类型
我们知道,一个值类型的变量永远不可能为null.它总是包含值类型本身.遗憾的是,这在某些情况下会成为问题.例如,设计一个数据库时,可将一个列定义成为一个32位的整数,并映射到FCL的Int32数据类型 ...
- 第十七章 委托 第十八章 Attribute 第十九章 可空值类型
1.委托揭秘 定义一个委托,编译器会生成一个继承自System.MulticastDelegate的类,所有的委托都继承自该类. 由于委托是类,所以能定义类的地方,都能定义委托. 委托内部有一个tar ...
- C# 关于NULL 可空值类型 ? 和空接操作符??
作者 陈嘉栋(慕容小匹夫) C#引入了可空值类型的概念.在介绍究竟应该如何使用可空值类型之前,让我们先来看看在基础类库中定义的结构--System.Nullable<T>.以下代码便是Sy ...
- CLR via C#可空值类型
我们知道,一个值类型的变量永远不可能为null.它总是包含值类型本身.遗憾的是,这在某些情况下会成为问题.例如,设计一个数据库时,可将一个列定义成为一个32位的整数,并映射到FCL的Int32数据类型 ...
随机推荐
- QUnit使用笔记-1判断方法
QUnit是一个前端测试工具. 判断效果: html基本结构: <h1 id="qunit-header">QUnit</h1> <h2 id=&qu ...
- Revit二次开发示例:DisableCommand
Revit API 不支持调用Revit内部命令,但可以用RevitCommandId重写它们(包含任意选项卡,菜单和右键命令).使用RevitCommandId.LookupCommandId()可 ...
- HDU 4003 (树形DP+背包)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4003 题目大意:有K个机器人,走完树上的全部路径,每条路径有个消费.对于一个点,机器人可以出去再回来 ...
- topcoder SRM 593 DIV2 WolfDelaymaster
#include <iostream> #include <string> #include <algorithm> using namespace std; cl ...
- 【POJ】2954 Triangle(pick定理)
http://poj.org/problem?id=2954 表示我交了20+次... 为什么呢?因为多组数据我是这样判断的:da=sum{a[i].x+a[i].y},然后!da就表示没有数据了QA ...
- NOIP200304麦森数
试题描述 形如2P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2P-1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=3021377,它有9 ...
- [shell] if else以及大于、小于、等于逻辑表达式 [转]
本文也即<Learning the bash Shell>3rd Edition的第五章Flow Control之读书笔记,但我们将不限于此.flow control是任何编程语言中很常用 ...
- OpenCV Show Image cvShowImage() 使用方法
新版的OpenCV在所有的函数和类前都加上了cv或Cv,这样很好的避免了区域污染(namespace pollution),而且不用在前面加‘cv::’,非常的使用.像之前的imshow()函数被现在 ...
- 8.20 css样式表:样式分类,选择器。样式属性,
样式表分类: 1.内联样式表, 和html联合显示,例:<p style="font-size:14px;">内联样式表</p> 2.内嵌样式表 作为一个独 ...
- 涉及 C#的 foreach问题
当时是用foreach实现遍历,但是函数传入参数是Object类型的,由于Objectl类型没有实现相关接口,所以foreach并不能执行. 那么下面我们来看看,想要使用foreach需要具备什么条件 ...