值类型的变量永远不会变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的更多相关文章

  1. int? 竟然真的可以是 null!.NET/C# 确定可空值类型 Nullable 实例的真实类型

    使用 Nullable<T> 我们可以为原本不可能为 null 的值类型像引用类型那样提供一个 null 值.不过注意:Nullable<T> 本身也是个 struct,是个值 ...

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

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

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

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

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

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

  5. .NET 可空值类型

    Microsoft在CLR中引入了可空值类型(nullable value type)的概念. FCL中定义System.Nullable<T>类如下: [Serializable,Str ...

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

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

  7. C#中的可空值类型

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

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

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

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

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

随机推荐

  1. thinkphp+webuploader实现大文件分片上传

    大文件分片上传,简单来说就是把大文件切分为小文件,然后再一个一个的上传,到最后由这些小文件再合并成原来的文件 webuploader下载地址及其文档:http://fex.baidu.com/webu ...

  2. [工具] BurpSuite--Scanner功能

    BurpSuite--Scanner功能 0x00 配置 Scanner有四个选项 Result -- 展示扫描结果 Scan queue -- 显示扫描的队列 Live scanning -- 我们 ...

  3. 清北学堂提高组突破营游记day6

    还有一天就结束了..QWQ 好快啊. 昨天没讲完的博弈论DP: 一个标准的博弈论dp,一般问的是是否先手赢. 博弈论最关键的问题:dp过程. 对于一个问题,一定有很多状态,每个状态可以转移到其他的一些 ...

  4. 【译文】Git merge 和 Git rebase比较

    [译文]Git merge 和 Git rebase比较 原创: 胡江华 胡同学和朋友们的成长日记 2017-03-22 git rebase 这个命令经常被人认为是一种Git巫术,初学者应该避而远之 ...

  5. Java并发编程实战 第15章 原子变量和非阻塞同步机制

    非阻塞的同步机制 简单的说,那就是又要实现同步,又不使用锁. 与基于锁的方案相比,非阻塞算法的实现要麻烦的多,但是它的可伸缩性和活跃性上拥有巨大的优势. 实现非阻塞算法的常见方法就是使用volatil ...

  6. 洛谷P5055 可持久化文艺平衡树 (可持久化treap)

    题目链接 文艺平衡树的可持久化版,可以使用treap实现. 作为序列使用的treap相对splay的优点如下: 1.代码短 2.容易实现可持久化 3.边界处理方便(splay常常需要在左右两端加上保护 ...

  7. bash: ipconfig: command not found

    问题描述: [root@localhost ~]# ipconfig-bash: ipconfig: command not found[root@localhost ~]# 解决方法一: cd /e ...

  8. 【crontab】误删crontab及其恢复

    中秋节快到了,首先祝自己中秋快乐. 昨天下午六点,心里正想着加完一个crontab就可以下班了.本来想执行 crontab -e的,没想到手一抖就输入了crontab ,然后就进入了下面这个样子.

  9. Linux的解压缩相关命令

    Linux的解压缩相关命令 知识点: 1.zip命令 2.tar命令 3.压缩和解压常用组合

  10. UFUN函数 UF_TRNS(平移 变换)( uf5943 , uf5947)

    //设置class_dialog选择过滤 static int init_proc(UF_UI_selection_p_t select,void* user_data) { ; //实体 片体 UF ...