Unity3D 可空值类型 Nullable
值类型的变量永远不会变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,但不可拆箱为普通值类型否则会抛出异常
Unity3D 可空值类型 Nullable的更多相关文章
- int? 竟然真的可以是 null!.NET/C# 确定可空值类型 Nullable 实例的真实类型
使用 Nullable<T> 我们可以为原本不可能为 null 的值类型像引用类型那样提供一个 null 值.不过注意:Nullable<T> 本身也是个 struct,是个值 ...
- 匹夫细说C#:可以为null的值类型,详解可空值类型
首先祝大家中秋佳节快乐~ 0x00 前言 众所周知的一点是C#语言是一种强调类型的语言,而C#作为Unity3D中的游戏脚本主流语言,在我们的开发工作中能够驾驭好它的这个特点便十分重要.事实上,怎么强 ...
- C# 关于NULL 可空值类型 ? 和空接操作符??
作者 陈嘉栋(慕容小匹夫) C#引入了可空值类型的概念.在介绍究竟应该如何使用可空值类型之前,让我们先来看看在基础类库中定义的结构--System.Nullable<T>.以下代码便是Sy ...
- [CLR via C#]19. 可空值类型
我们知道,一个值类型的变量永远不可能为null.它总是包含值类型本身.遗憾的是,这在某些情况下会成为问题.例如,设计一个数据库时,可将一个列定义成为一个32位的整数,并映射到FCL的Int32数据类型 ...
- .NET 可空值类型
Microsoft在CLR中引入了可空值类型(nullable value type)的概念. FCL中定义System.Nullable<T>类如下: [Serializable,Str ...
- 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. ...
随机推荐
- Linux系统nmtui/nmcli绑定双网卡为team
今天给大家带来图形化界面网络配置工具—nmtui的使用方法,可以省去敲命令的繁琐,较少误操作,结果更加直观. 小知识: nmtui:Network Manager Text User Interfac ...
- 如何配置SQL Server数据库远程连接
本地数据库(SQL Server 2012或以上) 连接外网服务器的数据库,外网的服务器端需要做如下配置: 1.首先是要打开 数据的配置管理工具 2.配置相关的客户端协议,开启TCP/IP 3.数据库 ...
- 浅谈java虚拟机|系列2|JVM运行时
今天我们继续谈谈JVM架构. 今天主要讲讲JVM运行时, 先来一个图: 上篇文章,我们知道,JVM运行时,简单来说就是把class文件翻译成操作系统相关的机器码(或汇编语言),然后通过调用操作系统函数 ...
- 非root用户随开机而启动mysql服务
非root用户随开机而启动mysql服务 今天验证了一下,非root用户随开机而启动msyql服务的脚本执行效果,特此简要记录如下: 环境: 192.168.142.130 mysql 5.6.41 ...
- 转 弹性反向传播(RProp)和均方根反向传播(RMSProp)
from http://blog.csdn.net/tsq292978891/article/details/78619384 都是一种权值更新算法,类似于SGD算法,其中,RMSProp是RProp ...
- electron监听系统托盘,electron是否最小化到系统托盘
在项目中需要判断窗口是否最小化在系统托盘上,任务栏那已经关闭,查了一晚上的api,始终找不到可以调用的方法,最后绞尽脑汁想到了一个办法,那就是在点右上角的关闭按钮时,加个全局变量,用来标识已经最小到系 ...
- 【java】并发执行ExecutorService的sumbit返回值的顺序问题
ArrayList<Future> fl = new ArrayList<Future>(); for (int i = 0; i < 10; i++) { Future ...
- js-点击tab按钮,同一页面显示不同的内容
效果: html: JS: css: .tabs-two{ .two{ display: inline-block; font-size:14px; height: 17px; font-weight ...
- 详解cocos2dx 3.0的release版本在android平台的签名过程
当您的游戏准备发布前,需要编译成为release版本,命令中需要增加 -m release,编译命令如下: cocos compile -p android -m release 在编译结束后,生成x ...
- wannafly 挑战赛9 E 组一组 (差分约束)
链接:https://www.nowcoder.com/acm/contest/71/E 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 65536K,其他语言131072K Spec ...