跨度-获得原始价值

时间:2019-03-13 16:11:12

标签: c# .net system.memory

我希望获得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
}

我发现了两个带有辅助方法的静态类(如上所示),这些方法可能会有所帮助,但是我不确定在不使事情慢于复制的情况下做到这一点的最佳方法是什么。

1 个答案:

答案 0 :(得分:0)

根据Span Document

  

由于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.
}