结构与类很像,但其实是完全不同的.如果你不知道结构是什么东西,或者你不知道什么时候用它,或者你前面都懂了但不知道为什么要用它(直接看重点来了下面的部分),那就看看把.
Structs In Unity
我们先说什么时候你可能已经用到Structs:
- Vector2,Vector3,Vector4
- Rect
- Color and Color32
- Bounds
- Touch
- 自定义的小数据变量Point(x,y)这种
特别是在Vector(2~4)中,你会经常用来存储transform的position,scale,rotation或者点击屏幕的位置等等.
Struct要在Unity Inspector中正常显示需要在前面添加[System.Serializable]
什么是Structs
结构是一个复合数据类型.它看起来和类很像,使用方法差不多:
public struct Point{
public int x;
public int y;
}
public class Point{
public int x;
public int y;
}
下边是转载的资料: 区别: 结构是一种用关键字struct声明的自定义数据类型。与类相似,也可以包含构造函数,常数,字段,方法,属性,索引器,运算符和嵌套类型等,不过,结构是值类型。 1.结构的构造函数和类的构造函数不同。 a.结构不能包含显式的无参数构造函数。结构成员讲自动初始化为它们的默认值。 b.结构不能包含以下形式的初始值设定类:base(argument-list); 2.对于结构中的实例字段成员,不能在声明时赋值初始化。 3.声明了结构类型后,可以使用new运算符创建构造对象,也可以不使用new关键字。如果不使用new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。 4.结构不支持继承,即一个结构不能从另一个结构或类继承,而且不能作为一个类的基类。但是,结构从基类OBJECT继承。结构也可以实现接口。 5.什么时候用结构呢?结构使用简单,并且很有用,但是要牢记:结构在堆栈中创建,是值类型,而类是引用类型。每当需要一种经常使用的类型,而且大多数情况下该类型只是一些数据时,使用结构能比使用类获得更佳性能。
重点来了!
引用类型传递
上面说到类的实例化是引用传递,实际上引用类型实例化是创建在堆中,在栈中也作为局部变量开辟了内存空间,但栈中的是指向堆中分配的空间的地址.这是很重要的,因为一个类是可以很大的,包括很多的文件和其他对象.在这种情况,复制和传递整个可能会负面影响性能.
我相信大家对堆和栈不陌生,堆中的内存是通过GC来回收,而GC是一个过程,总会有处理时间吧,如果要回收的内容很多,相应时间会长,这样会占用游戏的帧频.所以不能经常创建对象.
如果不大看的懂内存分配,下面是一个例子:
public struct SomeStruct{ public class SomeClass{
public int NumberA; public int NumberB;
} }
class Program{
static void Main(string[] args){
SomeStruct ss = new SomeStruct();
ss.NumberA = 1;
SomeValue sv = new SomeValue();
sv.NumberB = 1;
}
}
这个代码的内存分布是
栈中有ss,sv指向堆的地址和NumberA = 1.
堆中有sv的代码和NumberB = 1.
下面是一个极度恶劣的代码:
void Update(){
//每一帧都创建一个新的对象
GameObject go = new GameObject;
}
你真的想new请在void Start(){ }中new.你可以自己复制运行下效果,那酸爽.
值类型传递
不要试了上面那个恶劣的代码就不敢在Update中new东西出来.上面也说过结构是通过值传递,而值传递是在栈中分配空间的,非常的容易回收.
void Update(){
Vector3 vec = new Vector3();
}
这是没有问题的.
最后struct是不能用setter的.
不明觉厉的就多看几遍哈.
|