纳金网

标题: Struct的重要性 [打印本页]

作者: may    时间: 2015-9-26 00:09
标题: Struct的重要性
结构与类很像,但其实是完全不同的.如果你不知道结构是什么东西,或者你不知道什么时候用它,或者你前面都懂了但不知道为什么要用它(直接看重点来了下面的部分),那就看看把.
Structs In Unity
我们先说什么时候你可能已经用到Structs:
特别是在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的.

不明觉厉的就多看几遍哈.






欢迎光临 纳金网 (http://rs.narkii.com/club/) Powered by Discuz! X2.5