最近不知怎么,偶尔想起了结构体struct,就我个人而言,已经很久没有在项目中使用过结构体了
有很长时间没有使用过C++了,但我还清晰的记得当时书上的一句话,C++中,类和结构体的唯一区别就是
默认的访问级别不同。
C++的默认访问级别是private的,只要你没有显式声明,字段或方法就是private
而struct的默认访问级别是public的
区别就在这里,其它使用上,继承接口,类,派生,虚函数,抽像等等都是一样的。(模板参数除外)
即便是这样,我基本上也很少使用struct.
在C#当中,struct变成了值类型。这让我一度以为struct变得很鸡肋,除了值类型以外,C#中的struct还是
sealed密封的,他不可以被派生(通过派生int,float,double这些类型来创建新的类型是不允许的),那么private,protected这些访问修饰符也变得没有意义。
即然struct是值类型,他只会在栈上分配空间,不会在堆上分配(除非结构是一个引用成员的字段)
但实际上,struct的应用无处不在。
首先,结构要比类的创建开销小。在某些情况下,使用结构来替代类可以提高性能。在哪些地方使用结构呢?
结构通常可以用于表示一些“纯数据”的类,比如我定义了x,y两个坐标,那么就是我们常用的Point类,实际上
是一个struct的实现,类似的,Size,Rect都是结构的实现,成义成结构以后,就可以进行重用,而且开销
要比类小。
这种情况很常见,我们总会在类中定义很多相关的值类型字段,如果要在多个地方重用,
我就可以定义成struct来重用,而且还有一个好处,因为结构是值类型,所以对象拷贝的时候,你不需要考虑深拷贝的情况。
再深一步的了解,在C#.Net当中,基元类型:Int,short,long,double这些都是struct实现的。
那么相应的,Unity中我们使用的Vector2,Vector3向量,也都是struct实现的。
而且在使用struct时,也要通过new进行创建,也可以不使用new创建,但在使用之前,必须要先进行赋值。
如下截图:
最后总结下C#中,结构的特点:
1.struct是值类型,内存开销比类小
2.struct是密封的,无法被派生,但是他可以继承其它类和接口,所有结构都派生自System.ValueType
应用场景:
表示”纯数据类“时,使用结构代替类,内存开销更小,更合适,确切说,相关值类型的集合,比如Point,Size,Vector2,Vector3等等
说罢,想起了这段时间帮朋友做的一个模块中有struct可以应用的场景,现在就去重构下。
偶像镇楼!