数据类型
C#中所有的类型最终都派生自基类System.Object
- 值类型
- 值类型最终派生自基类System.ValueType。
- 值类型主要包括结构和枚举两类。
常用结构类型:Int32(int),Single(float),Double(double),Boolean(bool)及自定义结构类型等。
枚举类型如:FontStyle.
- 引用类型
- 所有称为类的类型都是引用类型。
- 常用这几个关键字来声明:Class,Interface,Delegate
- String是引用类型而非值类型。
预定义值类型与引用类型
注:在C#中几种基本声明类型和对应的实际类命名并不相同。
C#关键字 .NetCTS类型 类型 位数 值范围 sbyte System.SByte 整数 8位 -128~127 byte System.Byte 整数 8位 0~255 short System.Int16 整数 16位 -32768~32767 ushort System.UInt16 整数 16位 0~65535 int System.Int32 整数 32位 -2^31~(2^31)-1 uint System.UInt32 整数 32位 0~2^32 long System.Int64 整数 64位 -2^63~(2^63)-1 ulong System.UInt64 整数 64位 0~2^64 float System.Single 浮点 32位 ±1.5 × 10^-45 ~ ±3.4 × 10^38 精度为7位 double System.Double 浮点 64位 ±5.0 × 10^-324 ~ ±1.7 × 10^308 精度为15~16位 decimal System.Decimal 高精度 128位 ±1.0 × 10^-28 ~ ±7.9 × 10^28 精度为28~29位 bool System.Boolean 布尔 1位 true或false char System.Char 整数 16位 16位Unicode字符 object System.Object 对象 string System.String 字符串 区别
- 存储值类型的变量直接包含值,而引用类型则是包含一个对象实例的引用。
因此在使用变量赋值给另一个变量时,值类型会复制包含的值,引用类型则复制引用。 - 值类型是隐式密封的,不能派生其他类型。
- 内存分配不同。
- 存储值类型的变量直接包含值,而引用类型则是包含一个对象实例的引用。
内存分配
引用类型使用new操作符创建。
创建过程:- 计算目标类及其父类实例所需字节数和一些额外信息(如对象指针、同步索引块等)
- 在托管堆上分配内存空间
- 初始化对象的类型对象指针及同步索引块
- 调用当前类型的实例构造器及基类构造器
- 返回新建类型的引用
值类型一般分配在线程栈上,根据一些特殊需要,值类型也可能分配在托管堆上
如以下几种情况:- 数组中的元素
- 引用类型中的值类型字段
- 迭代器块中的局部变量
- 闭包情况下匿名函数的局部变量
- 其他
Unity中几个重要的类
- UnityEngine.Object:C#脚本最基本的类。
- UnityEngine.Component:所有能添加到游戏对象上的组件的基类。
- UnityEngine.MonoBehaviour:派生自Behaviour类,也是Unity中所有C#脚本默认显式继承的父类。脚本中的生命周期函数只有在继承MonoBehaviour并挂在到游戏对象上时才会生效。
- UnityEngine.GameObject:所有场景中实例的基类,获取游戏对象信息的主要手段。
- UnityEngine.Transform:处理游戏对象位置,大小,旋转角度相关信息,且常用于处理游戏对象父子级关系。
- UnityEngine.Rigidbody:物理模拟相关的效果处理。
- UnityEngine.Collider:所有碰撞器的基类。
- 其他如Time、Renderer、ParticleEmitter等等包括其他命名空间的就不一一列举了。
凡是继承MonoBehaviour及MonoBehaviour本身都无法通过new关键字来实例化。一般通过AddComponent()创建脚本实例,使用GetComponent()访问脚本组件
Unity中几个重要的值类型
- UnityEngine.Vector2、Vector3、Vector4:用来表示向量,可以进行点乘(Dot)和差乘(Cross)计算,来直接或间接获取一些常用信息,且提供了一些常用向量。
- UnityEngine.Mathf:包含大量常用数学计算公式。
- UnityEngine.Color:包含许多常用颜色,可以通过new创建任意颜色的实例。
- System.DateTime:用于日期读取和计算,虽然不是Unity自带的结构,但也比较常用。
- 其他:如Ray、RaycastHit、Touch、Rect …等等
关于值类型与引用类型的其他知识放在各个相关部分笔记中再详述。
参考资料:
- 《Unity3d脚本编程》—陈嘉栋
- 官方文档