查看: 708|回复: 0
打印 上一主题 下一主题

[其他] Struct的重要性

[复制链接]
may    

8830

主题

81

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
52336
精华
343

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2015-9-26 00:09:12 |只看该作者 |倒序浏览
结构与类很像,但其实是完全不同的.如果你不知道结构是什么东西,或者你不知道什么时候用它,或者你前面都懂了但不知道为什么要用它(直接看重点来了下面的部分),那就看看把.
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的.

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

分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-27 12:39 , Processed in 0.480541 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部