Unity使用可空类型(Nullable Types)

译林军 范春彦|2014-04-09 09:46|5407次浏览|Unity(375)0

你怎么确定一个Vector3,int,或float变量是否被分配了一个值?一个方便的方式就是使用可空类型!

有时变量携带重要信息,但只有在特定的游戏事件发生时触发。例如:一个角色在你的游戏可能闲置,直到他被告知去一个指定的目的地。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public class Character : MonoBehaviour

{

    Vector3 targetPosition;

    void MoveTowardsTargetPosition()

    {

        if(targetPosition != Vector3.zero)

        {

            //Move towards the target position!

        }

    }

    public void SetTargetPosition(Vector3 newPosition)

    {

        targetPosition = newPosition;

    }

}

在这种情况下,我们希望这个角色走向目标位置,仅仅在它被设定的时候。在上面的代码中,我们通过检查targetPosition是否不等于其默认值(0,0,0)来实现.但现在我们有一个问题:如果你想要你的角色move to(0,0,0)呢?你不用怀疑这个值,因为它确实可能会在游戏中出现!

幸运的是,有一个诀窍来:可空类型.它避免了通过比较任意值来确认一个变量是否被初始化。

使用可空类型

创建可空类型,仅需在任何一个值类型(如Vector3,Rect,int,float)的变量声明后,添加一个“?”。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

public class Character : MonoBehaviour

{

    //Notice the added "?"

    Vector3? targetPosition;

    void MoveTowardsTargetPosition()

    {

        if (targetPosition.HasValue)

        {

            //Move towards the target position!

            //use targetPosition.Value for the actual value

        }

    }

    public void SetTargetPosition(Vector3 newPosition)

    {

        targetPosition = newPosition;

    }

}

看到这里,可空类型有两个属性我们可以使用:HasValue(如果已经指定了变量则为true,否则false),和Value(变量的实际分配值)。


1

2

3

4

5

6

7

8

9

//First, check if the variable has been assigned a value

if (targetPosition.HasValue)

{

    //move towards targetPosition.Value

}

else

{

    //targetPosition.Value is invalid! Don‘t use it!

}

用法注释

  • 回复可空类型为“无值”,将其设置为null
  • 你不能从类或引用类型(他们已经可以设置为null)创建可空类型

像往常一样,如果你有任何问题或建议,在下面的评论中回复!

原文链接:Nullable Types

Unity使用可空类型(Nullable Types)

时间: 2024-11-05 22:34:02

Unity使用可空类型(Nullable Types)的相关文章

【C#】可空类型(Nullable)

C# 可空类型(Nullable) C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值. 例如,Nullable< Int32 >,读作"可空的 Int32",可以被赋值为 -2,147,483,648 到 2,147,483,647 之间的任意值,也可以被赋值为 null 值.类似的,Nullable< bool > 变量可以被赋值为 true 或 false 或 null.

细说可空类型 nullable PropertyType

可空类型是System.Nullable结构体的实列.一个可空类型代表了相应值类型的正确范围附加null值.这么说来,其实也不是很明子,命题嘛,一般不求易懂,但求准确. 那我就来说说这可空类型吧,上次说到了值类型与引用类型,其中就说到了,值类型是不能为空的,int i=null是错的,值类型为能为空,但我们有时候需要让值类型也可以为空,怎么办呢,那就在值类型的值的范围上扩充一个null值. 为什么要有可空类型 我们在日常开发中,什么地方需要让值类型也变成可空呢?如果你有试过把数据库内的数据对象化

Nullable可空类型

一个Nullable类型就是基本类型加上一个"是否为null指示器"的合成类型.对于一个类型,如果既可以给他分配一个值,也可以给它分配null引用,我们就说这个类型是可空的. 可空类型会多了两个属性 1.HasValue 是否有值 2.Value 获取值 来看个DEMO,这个东西,真没什么好说的.就是容易忘记,如何判断. public class Program { static void Main(string[] args) { int? avalue = null; if (av

可空类型(Nullable)

可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值 语法: < data_type> ? <variable_name> = null;   using System; namespace CodeReview { class Program { /// <summary> /// C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值 ///例如,Nullable<

53. C# -- 可空类型(Nullable)

C# 可空类型(Nullable) 理论: C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值. 例如,Nullable< Int32 >,读作"可空的 Int32",可以被赋值为 -2,147,483,648 到 2,147,483,647 之间的任意值,也可以被赋值为 null 值. Nullable< bool > 变量可以被赋值为 true 或 false 或 null

Kotlin---------------可空类型与? ?: ?. !!

可空类型主要是为了从编译层面尽可能的减少NPE. 在Kotlin中申明一个变量,如果类型后面不加?则不能直接给此变量赋值为null,在类型后面加上?就变成了可空类型,而可空类型可以直接赋值为null var name: String = null//Error:Null can not be a value of a non-null type String var name1: String? = null//可空类型,可以赋值为null 那么可空类型和普通的类型在使用上有什么区别呢,这就涉及

可空类型

可空类型.匿名方法和迭代器这三个优美的特性是在C#2.0里面提出来的. 1.可空类型 当我们在使用数据库的时候,会发现这样的一个矛盾点:数据库的字段设置是允许为null的,比如日期的字段,当你想把数据库表映射为C#中的对象时会发现,DateTime类型在C#语言中是不能为null的! 1.1 简介 可空类型也是值类型,但它是包含null值的值类型:int? nullable=null; int?就是可空的int类型.很明显,这又是一个语法糖,肯定不会存在int?这样的类型.对于编译器而言,int

C# 可空类型

可以为null的类型赋其基础类型正常范围的值和null值. 例如:Nullable<Int32>可以赋值为-2147483618到2147483618之间任意值和null.(int?=null 或int?=9) 在处理数据库和其他包含可能未赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型的功能特别有用. 例如,数据库中的布尔型字段可以存储值 . 例子说明: using System; namespace CalculatorApplication { class Nullables

C#可空类型的速度和GC Alloc测试

在Unity中进行速度和GC Alloc的测试 测试脚本: using UnityEngine; using System; using System.Collections; using System.Diagnostics; public class NullableTest : MonoBehaviour { void Start() { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); for (int i = 0; i