如何在类型T的单个变量(字段或ref参数)上创建长度为1的Span <T>

Vla*_*kov 2 c# memory .net-core

这个问题是关于类型Span<T>RealOnlySpan<T>.NET Core的。该文档介绍了如何在阵列,阵列段,堆栈分配或非托管内存上创建跨区。在某些情况下,我想在单个变量(字段,ref参数或ref局部变量)上创建长度为1的跨度,以将其传递给可以处理任意跨度的API。我怎样才能做到这一点?

我想可能会有一个构造函数Span<T>.Span(ref T),但显然没有。将变量复制到数组中并在该数组上创建跨度并不能解决问题,因为跨度的任何修改都不会反映在原始变量上。

Ben*_*ams 5

MemoryMarshal.CreateSpan<T>(ref T reference, int length)
Run Code Online (Sandbox Code Playgroud)

1作为长度参数传递。请注意,这本质上是不安全的*,这就是其在System.Runtime.InteropServices名称空间中的原因。

*无论如何都不会检查其有效性,如果长度太长,您将覆盖其他内存,如果从某个方法返回其范围及其局部变量,则可能会遇到麻烦等。


Who*_*dev 5

struct如果您的类型是 a (示例:int值初始化为 123),则可以安全地替代已接受的答案:

ReadOnlySpan<int> mySpan = stackalloc int[1] { 123 };
Run Code Online (Sandbox Code Playgroud)

如果您想要一个非只读范围,您可以将变量声明为对范围第一个元素的引用,如下所示:

Span<int> mySpan = stackalloc int[1] { 123 };
ref var myVariable = ref mySpan[0];
Run Code Online (Sandbox Code Playgroud)

现在访问变量或范围的内容将访问/写入相同的值。