第3章介绍了创建引用类型(类)和值类型(结构)。类的示例存储在托管堆上。结构的值可以存储在堆栈上,或者当使用装箱时,可以存储在托管堆上。现在我们有了另一种类型:一种只能在堆栈上存储其值的类型,而不会在堆上存储,有时称为类ref类型。这种类型的装箱是不可能的。这样的类型用ref struct关键字声明。使用ref struct提供了一些额外的行为和限制。限制如下:
- 它们不能添加为数组项。
- 它们不能用作泛型类型参数。
- 它们不能装箱。
- 它们不能是静态字段。
- 它们只能是类ref类型的实例字段。
在本节中,Span<T>和ReadOnlySpan<T>是类似于ref的类型。这些类型已经在讨论数组扩展方法的第7章中介绍了,在第9章中介绍了字符串的扩展方法。这里介绍的附加特性包括在托管堆、堆栈和本机堆上引用数据。
1. Span引用托管堆
Span可以引用托管堆上的内存,如第7和第9章所示。在下面的代码片段中,创建了一个数组,并使用扩展方法AsSpan创建了一个新的Span,它引用托管堆上的数组的内存。创建在变量span1中引用的Span之后,创建Span的一个切片,其中用值42填充。下一个Console.WriteLine将span1的值写入控制台:
static void SpanOnTheHeap()
{
System.Console.WriteLine(nameof(SpanOnTheHeap));
Span<int> span1 = (new int[]{1,5,11,71,22,19,21,33}).AsSpan(