C#2.0之可空类型
可空类型Nullable<T>
在C#2.0之前 ,值类型一直不可以为null,但是实际开发中常常会有这样的需求,比如结束时间。
为什么不可以为null
对于引用类型来说,null代表着空引用。就像href中的javaScirpt:,在内存中这一区域会全部用零表示,在GC的时候也会更加的轻松,对于值类型来说零是一个有效值 。
当然也有相应的替代方式
魔值
犧牲一个我们似乎永远也用不到的值 ,比如maxValue。但是这样做是非常的不优雅的
使用标志位
一个值类型对应着一个bool的变量,false表示没有值,true表示有值 。这看起来还不错,但是要维护两份变量
使用引用类型
object是所有类型的基类,同时它也是引用类型。但是这样会有着反復的拆箱与装箱,这也并不是我们所想要的
C#2.0使用了Nullable<T>
这种解決方式非常的优美,Nullable<T>是一个泛型的结构体。首先限制了T必须为struct类型。
这样问题又来了,Nullable也是值类型,为什么会可以为null呢。其实这只是C#玩的一个小花招而已,下面我来写一个简易版本的MyNullable<T>
可以看下面MyNullable<T>的代码了,HasValue是bool默认是false。如果通过構造函數斌值那么就是true了。

下面是測試用例,x获取value会报异常nullable Object mush have a value,而y则不会。

而C#中我们甚至可以直接为Nullable<T>賦值为null,这就是編譯器和CLR做的小花招了,如果反編譯就会看到它的真实面貌。而之后的版本里,又增加了各种各样的語法糖,比如与null进行对比(重写了Equals方法)以及使用int?这样更直观的方式进行声明
比较的问题
一个nullInt与nullInt进行比较时,>=竟然永远是false。毕竟 null 也 应该等于null 嘛。。不过这个对于实际应用中不会造成任何问题

as转换的性能缺陷
C#2.0中有了as转换操作符,在之前我们需要先is 是否是某类型然后再强制转换。而as一次就够了,但是令人惊讶的是它的性能竟然不如之前的解决方案,事实上是差很多,下次进行了测试两个版本


耗时分别是 1724 与 4919,不过我们敲码时如果整体性能不错,那么也可以使用as,毕竟优雅了很多。而且这也是一千万次的测试的结果
空合并操作符
对于可空类型的值类型,我们在判断时相比较值类型又多了一项判断那就是为null的判断。我们的代码看起来就是下面这样
If(i==null)
{
return 0;
}else
{
return I;
}
而空合并操作符??为我们提供了简便
Var x = i??0;
意思就是i为null吗?不为null就用i的值返回,为null就用后面的值返回,而且这样条件可以一直延续下去。空合并操作符还可以适用于引用类型
Var x= i??y??d??c??0;
我们还可以空合并操作符来简化我们的逻辑判断,重写比較器CompareTo,让其返回不是int而是int?。这样我们就可以使用??了
C#2.0之可空类型的更多相关文章
- 四、可空类型Nullable<T>到底是什么鬼
值类型为什么不可以为空 首先我们都知道引用类型默认值都是null,而值类型的默认值都有非null. 为什么引用类型可以为空?因为引用类型变量都是保存一个对象的地址引用(就像一个url对应一个页面),而 ...
- 【C#】可空类型(Nullable)
C# 可空类型(Nullable) C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值. 例如,Nullable& ...
- swift_枚举 | 可为空类型 | 枚举关联值 | 枚举递归 | 树的概念
***************可为空的类型 var demo2 :we_demo = nil 上面这个代码串的语法是错的 为什么呢, 在Swift中,所有的类型定义出来的属性的默认值都不可以是nil ...
- Guava-Optional可空类型
接上篇Guava之Joiner和Splitter,本篇将介绍Guava的另外一个有用的对象Optional,这在Java中Google Guava首先给我们提出可空对象模型的.在其他语言如c#这是已经 ...
- [C#] 可空类型的实现原理
int? 是可为null的值类型.只比int多一个值就是null. 思考: 同样的内存空间,怎么实现的多一个值的?都是4字节,32位,int?靠什么存在一个null值的. 发现: 分析一下内存,看看如 ...
- C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)
前言 之前对几个没什么理解,只是简单的用过可空类型,也是知道怎么用,至于为什么,还真不太清楚,通过整理本文章学到了很多知识,也许对于以后的各种代码优化都有好处. 本文的重点就是:值类型直接存储其值,引 ...
- C#学习笔记(六):可空类型、匿名方法和迭代器
可空类型 为啥要引入可空类型? 在数据库中,字段是可以为null值的,那么在C#中为了方便的操作数据库的值,微软引入了可空类型. 声明可空类型 我们可以使用两种方法声明一个可空类型: Nullable ...
- C# Nullable可空类型
一个Nullable类型就是基本类型加上一个"是否为null指示器"的合成类型.对于一个类型,如果既可以给他分配一个值,也可以给它分配null引用,我们就说这个类型是可空的. 可空 ...
- Kotlin——从无到有系列教程(5): 你该知道的Kotlin可空类型、空安全(null)、类型转换等特性
在我们熟知的Java中,定义一个变量可以默认不赋值,因为Java的系统会给我们默认赋一个默认值,并且Java可定义一个赋值为null的变量,这样在使用这个变量的时候都会去显示判断该变量是否为null. ...
随机推荐
- 使用Cors在WebApi中实现跨域请求,请求方式为angular的 $http.jsonp
使用Cors在WebApi中实现跨域请求 第一步,在webapi项目中安装cors 在Web API配置文件中(Global.asax)进行全局配置: public class WebApiAppli ...
- 一小时学会ECMAScript6新特性(一)
ECMAScript 简介 简称es,是一套标准,javascript就是使用这套标准的语言.主流的浏览器使用的是ECAMScript5,ECAMScript6(ECAMScript2015)是一涛新 ...
- vue的环境安装(一node环境)
话不多说都知道vue是基于node环境的.肯定是要安装node环境的 1.node官网下载https://nodejs.org/en/download/对应的版本我的是win的 2.双击下载下来的安装 ...
- oracle 报错无法从套接字获取更多数据
报错信息如下: ---查看_optimizer_join_elimination_enabled参数值 切换sys用户 select a.ksppinm name, b.ksppstvl value, ...
- 20175324 《Java程序设计》第七周学习总结
教材学习内容总结 常用实用类 String类 - 程序可以直接使用String类,但不能进行扩展,即String类不可以有子类 - 常用构造方法 - String(char a[])用一个字符数组a创 ...
- requirejs + sass 实现的前端及 grunt 自动化构建
对于 现在的 vue . react .webpack 来说也许有点旧了,有时候,越简单的技术越可靠,备份一下 module.exports = function(grunt) { // Projec ...
- 用appuploader生成发布证书和描述性文件
本帖最后由 长发飘 于 2017-4-13 12:34 编辑 之前用AppCan平台开发了一个应用,平台可以同时生成安卓版和苹果版,想着也把这应用上架到App Store试试,于是找同学借了个苹果开发 ...
- 链表加bfs求补图联通块
https://oj.neu.edu.cn/problem/1387 给一个点数N <= 100000, 边 <= 1000000的无向图,求补图的联通块数,以及每个块包含的点数 由于点数 ...
- PTA第四次作业
题目 7-1 计算职工工资 1.设计思路 (1)第一步:观察题意了解各个参数与所需函数在题目中的意义: 第二步:设计算法编写函数,让函数的功能实现题目中所需的功能: 第三步:运行程序检测是否错误. ( ...
- 【安富莱专题教程第5期】工程调试利器RTT实时数据传输组件,替代串口调试,速度飞快,可以在中断和多任务中随意调用
说明:1.串口作为经典的调试方式已经存在好多年了,缺点是需要一个专门的硬件接口.现在有了SEGGER的RTT(已经发布有几年了),无需占用系统额外的硬件资源,而且速度超快,是替代串口调试的绝佳方式.2 ...