假设我们有一个指向数组的子范围的跨度。
假设初始底层数组有足够的容量,有没有办法增加这个跨度?(假设我们不能使用
例子:
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)
不安全——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。