CSharp之结构
结构类型
结构类型是值类型,存储在栈中
如下图所示,右边托管堆中的快照分别为左侧断点的各个时期的快照,表明结构从
使用ref关键字按引用方式传递结构类型变量
将结构类型变量作为参数传递给方法或从方法返回结构类型值时,将复制结构类型的整个实例。 这可能会影响高性能方案中涉及大型结构类型的代码的性能。 通过按引用传递结构类型变量,可以避免值复制操作。 使用 ref、out 或 in 方法参数修饰符,指示必须按引用传递参数。 使用 ref 返回值按引用返回方法结果。
引用结构
从 C# 7.2 开始,可以在结构类型的声明中使用 ref 修饰符。 ref 结构类型的实例在堆栈上分配,并且不能转义到托管堆。 为了确保这一点,编译器将 ref 结构类型的使用限制如下:
- 引用结构不能是数组的元素类型。
- 引用结构不能是类或非 ref 结构的字段的声明类型。
- 引用结构不能实现接口。
- 引用结构不能被装箱为 System.ValueType 或 System.Object。
- 引用结构不能是类型参数。
- 引用结构变量不能由 lambda 表达式或本地函数捕获。
- 引用结构变量不能在 async 方法中使用。 但是,可以在同步方法中使用 ref 结构变量,例如,在返回 Task 或 Task
的方法中。 - 引用结构变量不能在迭代器中使用。