假设我们有一个指向数组子范围的跨度。
假设初始底层阵列有足够的容量来扩大这个跨度,有什么办法吗? (假设我们不能使用
例子:
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
最佳答案
不安全——Span 不知道底层数组有多大。
一个不安全选项是使用MemoryMarshal
:
var s2 = MemoryMarshal.CreateSpan(ref MemoryMarshal.GetReference(s1), 7);
我们使用 GetReference
获取指向数组中第一个元素的 ref int
变量,并将其传递给 CreateSpan
明确的长度。
长度不对可以写入任意内存,要小心!
可能有一种方法可以尝试从 Span
中取回原始数组,然后查询它的长度,但我找不到。 MemoryMarshal.TryGetArray
采用Memory
,而不是Span
。
关于c# - 增加一个 Span<T>,假设底层数组有足够的容量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64753314/