span <T>и потоки - PullRequest
       57

span <T>и потоки

0 голосов
/ 28 апреля 2018

Я уже некоторое время читаю о span и просто пытаюсь его реализовать. Однако, хотя я могу заставить span работать, я не могу понять, как заставить поток принять его, как они делают в примерах. Другие примеры показывают также поддержку int.parse, но я не могу найти перегрузки или расширения, которые делают это возможным.

Я пробовал как в .net Standard 2.0, так и в .net core 2.0.

Пожалуйста, укажите мне правильное направление, чтобы сделать эту работу.

Редактировать: Пример кода будет:

    Span<Byte> buffer = new Span<byte>();
    int bytesRead = stream.Read(buffer);

Ответы [ 2 ]

0 голосов
/ 31 июля 2018

Давайте рассмотрим пример, который мне пригодится, когда Span<T> происходит от PipeWriter.

var bufferSpan = pipeWriter.GetSpan(count);
stream.Write( /* Darn, I need an array, because no Span<T> overloads outside Core 2.1! */ );

Попробуйте получить Memory<T> вместо Span<T>, для которого вы можете получить базовый массив (за исключением некоторых экзотических обстоятельств).

var bufferMemory = pipeWriter.GetMemory(count); // Instead of GetSpan()
var bufferArraySegment = bufferMemory.GetUnderlyingArray();
stream.Write(bufferArraySegment.Array, bufferArraySegment.Offset, bufferArraySegment.Count); // Yay!

GetUnderlyingArray() вот небольшой метод расширения:

/// <summary>
/// Memory extensions for framework versions that do not support the new Memory overloads on various framework methods.
/// </summary>
internal static class MemoryExtensions
{
    public static ArraySegment<byte> GetUnderlyingArray(this Memory<byte> bytes) => GetUnderlyingArray((ReadOnlyMemory<byte>)bytes);
    public static ArraySegment<byte> GetUnderlyingArray(this ReadOnlyMemory<byte> bytes)
    {
        if (!MemoryMarshal.TryGetArray(bytes, out var arraySegment)) throw new NotSupportedException("This Memory does not support exposing the underlying array.");
        return arraySegment;
    }
}

В целом, это позволяет вам использовать методы с «современным» типом возврата в сочетании со «старыми» перегрузками фреймворка - без какого-либо копирования. :)

0 голосов
/ 30 апреля 2018

Span-результаты из потоков поддерживаются в .NET Core 2.1. Если вы проверите текущий исходный код, например, Stream , вы увидите, что он имеет перегрузки, такие как Read (Span) , которые читаются в Span<byte> вместо byte[] или Write (ReadOnlySpan) , который может записать ReadOnlySpan<byte> вместо byte[], перегрузки, использующие память и т. Д.

Для нацеливания на .NET Core 2.1 необходимо установить не менее Visual Studio 2017 15.7 Preview 4 или последний SDK для .NET Core 2.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...