结构体 struct 是一种用户自定义的值类型,常用于定义一些简单(轻量)的数据结构。对于一些局部使用的数据结构,优先使用结构体,效率要高很多。
- 可以有构造函数,也可以没有。因此初始化时可以
new
,也可以用默认default
。但当给字段设置了初始值时,则必须有显示的构造函数。 - 结构体中可以定义字段、属性、方法,不能使用终结器。
- 结构体可继承接口,并实现接口,但不能继承其他类、结构体。
- 结构体是值类型,被分配在栈上面,因此在参数传递时为值传递。
⁉️结构体始终都是分配在栈上吗?—— 不一定,当结构体是类的成员时,则会随对象一起分配在堆上。同时当结构体上有引用类型字段时,该字段只存储引用对象的地址,引用对象还是分配在堆上。
void Main() { Point p1 = default; //Point p1 = default(Point); Point p2 = new Point(1, 2); p1.X = 100; p2.X = 100; } public struct Point { public int X; public int Y; public Point(int x, int y) { X = x; Y = y; } }
1.1、只读结构体与只读函数
readonly struct
申明一个只读的结构体,其所有字段、属性都必须是只读的。
public readonly struct Point { public readonly int X,Y; }
用在方法上,该方法中不可修改任何字段值。这只能用在结构体中,结构体不能继承,不知道这个特性有什么用?
public struct Point { public int X; public int Y; public readonly int GetValue() { X--; //Error:不可修改 return X + Y; } }
1.2、Ref 结构体
ref 结构类型 用ref struct
申明,该结构体只能存储在栈上,因此任何会导致其分配到堆上的行为都不支持,如装箱、拆箱,作为类的成员等都不支持。
Ref 结构体 可用于一些高性能场景,System.Span、ReadOnlySpan 都是 readonly ref struct
结构体。
public ref struct Point { public int X,Y; }