Когда использовать ReadOnlySpan против явных/перегруженных типовC#

Место общения программистов C#
Ответить
Anonymous
 Когда использовать ReadOnlySpan против явных/перегруженных типов

Сообщение Anonymous »

Ради последующего вопроса предположим гипотетически, что я хочу преобразовать строку обычного текста в шестнадцатеричную строку; например, «Привет, мир!» в "48656c6c6f2c20576f726c6421".
Для этого требуется два шага:
  • Преобразуйте обычную текстовую строку в массив байтов.< /li>
    Преобразовать массив байтов в шестнадцатеричную строку.
Например:
< pre class="lang-cs Prettyprint-override">

Код: Выделить всё

string plainText = "Hello, World!";
byte[] bytes = Encoding.Default.GetBytes(plainText);
string hexadecimalString = Convert.ToHexString(bytes);
Далее я хочу обернуть эту функциональность в служебную функцию. До .NET Core 2.1 (и я удивлен, что ReadOnlySpan настолько стар), наиболее гибким подходом было бы наличие перегрузок для string и char[]; например:

Код: Выделить всё

public static string ToHexString(string value, Encoding? encoding = null) =>
ToHexString(value.ToCharArray(), encoding);

public static string ToHexString(char[] value, Encoding? encoding = null) =>
Convert.ToHexString((encoding ?? Encoding.Default).GetBytes(value));
Хотя этот подход относительно тривиален, он не особенно удобен с точки зрения распределения, поскольку требуется три распределения: Введение ReadOnlySpan может улучшить эту ситуацию за счет сокращения количество выделений (хотя и только на 1), но также с точки зрения удобства обслуживания требуется меньше перегрузок методов, поскольку string и char[] неявно преобразуются в ReadOnlySpan; например (в идеальном мире):

Код: Выделить всё

public static string ToHexString(ReadOnlySpan value, Encoding? encoding = null) =>
Convert.ToHexString((encoding ?? Encoding.Default).GetBytes(value));
По иронии судьбы, хотя ReadOnlySpan теоретически должен уменьшить количество выделений, проблема здесь в том, что GetBytes не имеет перегрузки, которая принимает ReadOnlySpan< /code>, поэтому единственный способ реализовать это — повторно ввести распределение; например:

Код: Выделить всё

public static string ToHexString(ReadOnlySpan value, Encoding? encoding = null) =>
Convert.ToHexString((encoding ?? Encoding.Default).GetBytes(value.ToArray()));
В настоящее время единственный способ уменьшить выделение — предоставить перегрузки методов и реализовать их все отдельно; например:

Код: Выделить всё

public static string ToHexString(string value, Encoding? encoding = null) =>
Convert.ToHexString((encoding ?? Encoding.Default).GetBytes(value));

public static string ToHexString(char[] value, Encoding? encoding = null) =>
Convert.ToHexString((encoding ?? Encoding.Default).GetBytes(value));
Теперь у нас есть методы, которые позволят сократить выделение ресурсов, поскольку нет преобразований из string в char[] или ReadOnlySpan в char[], но компромиссом является то, что это приводит к более высоким затратам на сопровождение, поскольку теперь мне приходится поддерживать два метода и менее гибкий API для вызывающего объекта.
Итак, мой вопрос: когда правильно использовать ReadOnlySpan в качестве параметра метода, а не использовать более явные/перегруженные типы? Должен ли компромисс быть смещен в сторону удобства сопровождения и надежного API, опирающегося на неявное преобразование типов, или в сторону производительности? Есть ли какие-то рекомендации по этому поводу?
P.S. если вы считаете, что это заслуживает отрицательного голоса, будьте любезны объяснить, почему.

Подробнее здесь: https://stackoverflow.com/questions/784 ... aded-types
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»