Класс StringPool

Тип StringPool реализует настраиваемый пул для string экземпляров. Этот пул позволяет минимизировать выделение памяти при создании нескольких экземпляров string из буферов char или byte значений. Он предоставляет механизм, который несколько похож на string интернирование. Основные различия заключается в том, что пул настраивается, его можно сбросить, он использует политику наилучших усилий и не требует предварительного создания string объектов. Таким образом, при работе с временными буферами он может сохранять начальные выделения.

API платформы:StringPool

Синтаксис

API StringPool является основной точкой входа для GetOrAdd(ReadOnlySpan<char>). Этот API возвращает string экземпляр, соответствующий содержимому входных данных ReadOnlySpan<char>. API может получить возвращенный объект из внутреннего пула.

Например, представьте, что у вас есть входные данные string, представляющие URL-адрес заданного веб-запроса, и вы хотите получить string, содержащий только имя хоста. Если вы получаете большое количество запросов, возможно для небольшого числа хостов, вам может потребоваться кэшировать эти string экземпляры. Это можно сделать с помощью StringPool типа следующим образом:

public static string GetHost(string url)
{
    // We assume the input might start either with eg. https:// (or other prefix),
    // or directly with the host name. Furthermore, we also assume that the input
    // URL will always have a '/' character right after the host name.
    // For instance: "https://learn.microsoft.com/dotnet/api/system.string.intern".
    int
        prefixOffset = url.AsSpan().IndexOf(stackalloc char[] { ':', '/', '/' }),
        startIndex = prefixOffset == -1 ? 0 : prefixOffset + 3,
        endIndex = url.AsSpan(startIndex).IndexOf('/');

    // In this example, it would be "learn.microsoft.com"
    ReadOnlySpan<char> span = url.AsSpan(startIndex, endIndex);

    return StringPool.Shared.GetOrAdd(span);
}

Предыдущий метод не выделяет память вообще, если запрошенный string уже присутствует в кэше. Подстановка использует только входные ReadOnlySpan<char> данные, которые представляют представление на входном URL-адресе string.

Этот StringPool тип также может быть полезным при анализе необработанных запросов с помощью другой кодировки, например UTF8. Существует перегрузка GetOrAdd, которая принимает входные данные ReadOnlySpan<byte> и экземпляр Encoding. Эта перегрузка использует временный буфер, взятый напрокат из пула, чтобы получить значение ReadOnlySpan<char>, используемое для поиска. Этот подход может значительно сократить количество выделений в зависимости от конкретного сценария использования.

Примеры

Дополнительные примеры можно найти в модульных тестах.