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#对可空值类型的支持

  1. Nullable<T>是值类型,实例仍然是”轻量级”的。即仍然可以在栈上,实例的大小就是原始值类型+Boolean字段大小。
  2. Int32?等价于Nullable<Int32>。
  3. 一元操作符(++,+,-,--,!,~) 操作数是null,结果就是null。
  4. 二元操作符(+,-,*,/,%,&,|,^,<<,>>)两个操作数中任何一个是null,结果就是null。

Int32?   a=5;

Int32?   b=null;

//一元操作符

a++//6;

b=-b; //null;

//二元操作符

a=a+3;//a=9;

b=b*3;//b=null;

  1. 相等性操作符(==,!=)两个操作数都是null,两者相等;一个操作数是null这两者不相等。两个操作数都不是null,就比较值来判断是否相等。
  2. 关系操作符(<,>,<=,>=)两个操作数任何一个是null,结果就是false。两个操作数都不是null,就比较值。

二、C#的空结合操作符

  1. 空结合操作符(null-coalescing operator),即??操作符。
  2. 它要获取两个操作数,加入左边的操作数不为null,就返回这个操作数的值。如果左边的操作数为null,就返回右边的操作数的值。
  3. 利用空结合操作符,可以方便地变量的默认值。它既能拥有引用类型,也能用于可空值类型。
  4. ??在复合情形中更好用,如:

String  s= DoThing1() ?? DoThing2() ?? ”NoThing!”;

三、可空值的装箱拆箱调用GetType

  1. 当CLR对一个Nullable<T>实例进行装箱时,会检查它是否为null。

a)         若是,CLR不实际装箱,并返回null值;

b)         若不为null,CLR从可空类型中取出值,并对其进行装箱。

  1. CLR允许将一个已装箱的值类型T拆箱为一个T或者一个Nullable<T>。

若已装箱的值类型的引用是null,且要拆箱为一个Nullable<T>,那么CLR会将Nullable<T>的值设为null。

  1. Int32?  x=5;

Console.WriteLine(x.GetType());//输出System.Int32,而非System.Nullable<Int32>。

.NET 可空值类型的更多相关文章

  1. 匹夫细说C#:可以为null的值类型,详解可空值类型

    首先祝大家中秋佳节快乐~ 0x00 前言 众所周知的一点是C#语言是一种强调类型的语言,而C#作为Unity3D中的游戏脚本主流语言,在我们的开发工作中能够驾驭好它的这个特点便十分重要.事实上,怎么强 ...

  2. Util应用程序框架公共操作类(十):可空值类型扩展

    当你使用可空的值类型时,你会发现取值很不方便,比如Guid? obj,你要从obj中获取值,可以使用Value属性obj. Value,但obj可能为null,这时候就会抛出一个异常. 可空值类型提供 ...

  3. C#中的可空值类型

    C# 不允许把 null 赋给一个值类型的数据.在 C# 中,以下语句是非法的: int a = null;    // 非法 但是,利用 C# 定义的一个修饰符,可将一个变量声明为一个可空(null ...

  4. 【C#进阶系列】19 可空值类型

    可空值类型,正如字面意义上的,是可以为NULL的值类型. 这个东西存在的意义可以解决比如数据库的的Int可以为NUll的情况,使得处理数据库数据更简单. 实际上可空值类型就是Nullable<T ...

  5. CLR via C#(14)-可空值类型,关于?和??的故事

    我们都知道,值类型是不能为Null的,但是在实际应用中有些情形却需要将值类型置为null.因此,CLR中引用了可空值类型的用法.今天的文章中见到最多的符号估计就是?了吧. ?——初识可空值类型 1.  ...

  6. [CLR via C#]19. 可空值类型

    我们知道,一个值类型的变量永远不可能为null.它总是包含值类型本身.遗憾的是,这在某些情况下会成为问题.例如,设计一个数据库时,可将一个列定义成为一个32位的整数,并映射到FCL的Int32数据类型 ...

  7. 第十七章 委托 第十八章 Attribute 第十九章 可空值类型

    1.委托揭秘 定义一个委托,编译器会生成一个继承自System.MulticastDelegate的类,所有的委托都继承自该类. 由于委托是类,所以能定义类的地方,都能定义委托. 委托内部有一个tar ...

  8. C# 关于NULL 可空值类型 ? 和空接操作符??

    作者 陈嘉栋(慕容小匹夫) C#引入了可空值类型的概念.在介绍究竟应该如何使用可空值类型之前,让我们先来看看在基础类库中定义的结构--System.Nullable<T>.以下代码便是Sy ...

  9. CLR via C#可空值类型

    我们知道,一个值类型的变量永远不可能为null.它总是包含值类型本身.遗憾的是,这在某些情况下会成为问题.例如,设计一个数据库时,可将一个列定义成为一个32位的整数,并映射到FCL的Int32数据类型 ...

随机推荐

  1. 编译包含Google Play服务App的SDK版本问题

    编译包含Google Play服务App的SDK版本问题   错误信息:No Resouce identifier found for attribute 'touchscreen BlocksFoc ...

  2. Let the Balloon Rise

    Problem Description Contest time again! How excited it is to see balloons floating around. But to te ...

  3. Viola Jones Face Detector

    Viola Jones Face Detector是Paul viola 和 Michael J Jones共同提出的一种人脸检测框架.它极大的提高了人脸检测的速度和准确率. 速度提升方面:利用积分图 ...

  4. Ubuntu14.04 Server amd64 配置 Apache+MySQL+Django

    写在前面 因为不同版本的apache等软件文件夹和配置文件的名称设置都不尽相同,网上累死累活查了好多个博客就没一个能成功配出来的. 所以本文也不一定能帮到你,请在确定对自己有用之前不要盲目转载,以免给 ...

  5. Underscore.js 中 _.throttle 和 _.debounce 的差异

    两个方法都是用来控制事件的频率的,在mousemove,resize等这种高频率触发事件中,控制其响应频率可以明显提高程序的流畅性,减少资源的占用. 通过分析其源代码: _.throttle方法源码 ...

  6. 为tomcat 安装 native 和配置apr

    yum install -y apr-devel openssl-devel gcc 安装native cd /lxyy/tomcat7/bin tar zxvf tomcat-native.tar. ...

  7. 提升 web 应用程序的性能(一)

       提升 web 应用程序的性能,找出瓶颈,加快客户端内容的速度.    作为 web 用户,我们知道页面加载或刷新的速度对其成功至关重要.本文将帮助您更好地理解影响 web 应用程序性能的因素.学 ...

  8. Spring声明式事务配置管理方法

    环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加方法: 点击项目右键->Build Path->Add ...

  9. nginx源码编译安装

    安装编译所需的包: [root@xaiofan ~]# yum install -y gcc gcc-c++ autoconf automake 安装nginx使用某些功能需要的包: [root@xa ...

  10. debug阶段工作期站立会议2(进度推进)

    组名:天天向上 组长:王森 组员:张政.张金生.林莉.胡丽娜 代码地址:HTTPS:https://git.coding.net/jx8zjs/llk.git SSH:git@git.coding.n ...