首页 > 解决方案 > 跨度 - 访问原始值

问题描述

我希望获得 Span 代表的原始值。以下面的代码为例,我如何在不创建副本的情况下DoWork访问原始字节数组?

static void Main()
{
    var data = new byte[0x100];
    DoWork(new Span<byte>(data));
}

private void DoWork(Span<byte> Data)
{
    //var data = Data.ToArray(); Unsuitable; creates a copy
    //var data = (byte[])Data; Unsuitable; doesn't work
    //MemoryMarshal. Something in here may work, but unsure
    //MemoryExtensions. Something in here may work, but unsure
}

我发现 2 个带有辅助方法的静态类(如上所示)可能会有所帮助,但我不确定在不使事情变得比复制更慢的情况下最好的方法是什么。

标签: c#.netsystem.memory

解决方案


根据跨度文件

因为它是仅栈类型,所以 Span 不适用于许多需要在堆上存储对缓冲区的引用的场景。例如,对于进行异步方法调用的例程来说,情况就是如此。对于这种情况,您可以使用免费的 System.Memory 和 System.ReadOnlyMemory 类型。

因此,也许根据您的需要,您不必使用 Span:

static void Main()
{
    var data = new byte[0x100];
    DoWork(data);
}
private void DoWork(byte[] data)
{
    // data array is by reference.
}

推荐阅读