c# - 增加一个 Span<T>,假设底层数组有足够的容量

标签 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

最佳答案

不安全——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/

相关文章:

c# - 仅包含部分工作的 C#、MVC

c# - Dapper 和枚举作为字符串

c# - 如何过滤 AutoCompleteBox 中第一个匹配项的项目列表?

c# - 如何在 C# 中访问 Silverlight 对象的附加属性?

javascript - Kendo html 编辑器

c# - 如何使用 VS 2010 Beta2 在本地 IIS 7.5 上正确调试 Web 应用程序?

c# - 示例 Blazor 项目中计数器的状态是否可以在页面切换之间保留?

c# - IEquatable接口(interface)检查null时做什么

c# - 像谷歌地方一样切换按钮

c# - 在运行 Asp.Net Core 2 的 Webapi 2 上使用 Serilog 的 DI ILogger