值类型的变量永远不会变null,因为值类型是其本身不会变成null。引用类型可变成null,内存会全部使用0来表示null,因为这种开销会降低,仅仅需要将一块内存清除。

表示一些空值的方案:

  1.使用魔值:

非使用值:例如使用范围1-1000,即用0。但并非真正解决问题。

  2.使用标志位:

使用bool类型,这种标识比1)好一些,因为没有牺牲任何值。但由于俩变量关联性强,容易产生BUG。

  3.借助引用类型表示空值:

所有类型都派生自System.Object,可用Object类型,用Object表示null。但会涉及到频繁的拆箱和装箱,进而引发更多的垃圾回收机制,会对游戏性能产生一些影响。

  4.使用引用类型进行值类型封装:

将值类型放入引用类型里,虽然减少了封装和拆箱,但本质上是建立了一个新类型,代码增加,同时增加维护成本。

因此为了解决这个问题,c#引入了可空值类型的概念。基础类库结构System.Nullable<T>:

Nullable<int>test:

Test.Value:返回值

Test.hasValue:判断值是否为空。

C#允许用?来声明Nullable。

Int?testint=99等于Nullable<int>test=99。

对于一元操作符:包括“+”、“++”、“-”、“–”、“!”、“~”而言,如果操作数是null,则结果便是null;对于二元操作符,包括“+”、“-”、“*”、“/”、“%”、“&”、“|”、“^”、”<<”、”>>”,如果其中一个为null,结果就是null;对于相等操作符“==”、“!=”当俩者都为null则俩者相等,一个为null则不等,若都非空则比较值。

C#使用??操作符来作优化,??操作符能够对引用类型和可空类型使用。

??左边如果非空返回左边否则返回左边。假如一个变量需要保存英雄的id,如果这个英雄id为空则可以返回默认值。

For example:string heroId=heroTest.id??”帅哥”.

可以利用as将引用类型转换成可空值:

Obj i;

Int? test=I as int?;

可空值的装箱和拆箱:

可空类型是一个结构属于值类型,可以将值类型转换为引用类型。当Mono运行时会有装箱和拆箱的操作。当一个Null的可空型装箱为obj,拆箱时obj可以拆箱为Nullable,但不可拆箱为普通值类型否则会抛出异常

最新文章

  1. Linux进程管理子系统分析【转】
  2. httpUrlConnection中文乱码
  3. CodeForces462 A. Appleman and Easy Task
  4. protected的使用注意
  5. 社保系列11《ATR》
  6. [原创] CSS总结!! 有关HTML第二篇 !!
  7. 一个opencv 博客 大量文章(老版本编写C )
  8. WinForm 对话框、流
  9. 【Luogu3732】[HAOI2017]供给侧改革(Trie树)
  10. win7共享打印机如何设置,xp系统如何连接共享打印机。
  11. Linq 中的 in 与 not in 的使用
  12. 常用docker镜像
  13. Intel万兆网卡背靠背连接ping不通那点事儿
  14. Spring中线程池的应用
  15. $python用装饰器实现一个计时器
  16. qt creator在Qt5中中文显示的问题
  17. ES6学习笔记(对象)
  18. Jsp页面截取字符串
  19. 使用Kotlin开发Android应用(I):简介
  20. BETA0

热门文章

  1. python基础语法170题
  2. 如何在Linux下安装Tomcat
  3. spring事务配置,声明式事务管理和基于@Transactional注解的使用(转载)
  4. 前后台入门系统搭建详解(springboot+angularjs)
  5. tp5.1中的命名规范
  6. Python 爬虫插件
  7. 浅谈Mybatis通用Mapper使用方法_java - JAVA
  8. Leaflet使用vector tiles 标注label设置
  9. 19. ClustrixDB 执行计划解读
  10. mac安装指定版本的openjdk