增长 Span<T>,假设底层数组有足够的容量

Bog*_*gey 3 c#

假设我们有一个指向数组的子范围的跨度。

假设初始底层数组有足够的容量,有没有办法增加这个跨度?(假设我们不能使用

例子:

int[] array = new int[]{4, 17, 0, 2, 3, 16, 1};
var span = new Span<int>(array);

var s1 = span.Slice(0, 1);
// Assume we can't use "array" directly here anymore, but only s1
var s2 = s1.Slice(0, 2); // bang! Argument of ouf range exception, even though array would have enough capacity
Run Code Online (Sandbox Code Playgroud)

can*_*on7 6

不安全——Span 不知道底层数组有多大。


一种不安全的选择是使用MemoryMarshal

var s2 = MemoryMarshal.CreateSpan(ref MemoryMarshal.GetReference(s1), 7);
Run Code Online (Sandbox Code Playgroud)

我们用来GetReference获取一个ref int指向数组中第一个元素的变量,并将其传递给CreateSpan明确的长度。

如果长度错误,您可以写入任意内存,所以要小心!


可能有一种方法可以尝试将原始数组从 中取出Span,然后查询其长度,但我找不到。MemoryMarshal.TryGetArray需要 a Memory,而不是 a Span