Span - доступ к исходному значению - PullRequest
0 голосов
/ 13 марта 2019

Я хочу получить исходное значение, которое представляет 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 статических класса с вспомогательными методами (показанными выше), которые могут помочь, но я не уверен, что лучший способ сделать это, не делая вещи медленнее, чем просто сделать копию.

1 Ответ

0 голосов
/ 13 марта 2019

Согласно Документу Span :

Поскольку это тип только для стека, 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.
}
...