C# 类型系统

C#的类型系统

C#的类型系统是静态的、安全,并且大多数时候是显示的。
C#要求所有的类型全部从System.Object类派生。
在Unity 3D中,C#语言脚本接口是以MonoBehaviour这个类作为基础的。而MonoBehavior也是派生自这个类。
System.Object最基本的方法包括4个公共和2个受保护的方法:
Equals:两个对象的值是否相等
GetHashCode:
ToString: 默认返回类型的完整名称
GetType
MemberwiseClose
Finalize:虚方法,在对象被标志为应该被作为垃圾回收之后,但在内存被真正收回之前,会调用该方法。因此,如果需要在回收内存之前进行清理工作的类型应该重写该方法。
静态:每一个变量都有特定的类型,更重要的是该类型在编译时是确定的。
显示:声明变量时必须指明其类型。在C#3中引入了var来声明隐式类型的变量

var pi = 3.14;
var name = "miaomiaomiao";
var hello = "nihao";
however, the following statements are wrong, because C# is static language
var name = "miao";
name = 1234; //error!

安全:其本质对类型操作的一种规范。即不能将一种类型当做另一种类型,除非它们真的存在转换关系。

值类型和引用类型

操作符new所做的事情:
1) 计算所需的内存空间。
2) 为对象在托管堆上分配所需的内存空间, 分配的所有字节都初始化为0
3) 初始化“类型对象指针”和“同步块索引”
4) 调用构造器
5) 返回新建对象的一个引用

引用类型总是分配在托管堆上,值类型并非总是分配在线程栈上。
值类型不能派生出其他的类型。所有值类型都是隐式密封的,为了防止将值类型作为其他类型的基类型。这样做最直接的影响就是值类型无需提供额外的信息表示它的实际类型,因此它没有引用类型中额外的信息。这样缓解了托管堆的压力,减少了消耗巨大的垃圾回收的次数。

任何类都是引用类型,用Class Interface Delegate定义的类型都是引用类型。
值类型有数字型结构(System.Int32), 布尔型结构(system.Boolean) 用户自定义的结构。
DataTime是值类型

值类型的特点:
1) 值类型不派生出任何其他类型
2) 值类型不需要从其他类型派生
3) 值类型是不可变的。类型没有提供会更改其字段的成员。string不可变,但是引用类型。
4) 值类型是以值方式传递的
5) 值类型有两种表示方法,未装箱和装箱。装箱机制是指将值类型转换为引用类型。
6) 值类型派生自System.ValueType

Unity 3D中的引用类型

UnityEngine.Object
UnityEngine.Component
UnityEngine.MonoBehaviour:
凡是继承于MonoBehavior的类或MonoBehaviour本身都无法通过new关键字来实例化。
如果需要在代码中创建一个继承MonoBehaviour类的类型的对象时,应该如何做呢?
在Unity 3D中,组件是以脚本的形式挂载在游戏对象上的,那么新脚本的实例也可以通过这种方式挂载在游戏对象上,从而实现创建该类的目的。

unity游戏引擎的游戏脚本是单线程的
为了给游戏脚本提供一种类似多线程的功能,从而引入了协程。主要利用了C#的迭代器。
正常情况下协程是在Update函数返回时执行的,而协程的主要功能是延缓其执行(yield), 直到给定的YieldInstruction完成。

装箱和拆箱

装箱的过程:
1) 在托管堆中分配内存。注意除了值类型的各个字段所需要的内存外,还需要加上两个额外的两个成员(类型对象指针和同步索引块)所需的内存
2) 将值类型的字段复制到新分配的堆内存中
3) 返回对象地址

拆箱的过程:
1) 获取应装箱的对象中各个字段的地址
注意:拆箱不涉及复制的过程。

展开阅读全文

没有更多推荐了,返回首页