Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Тип StringPool реализует настраиваемый пул для string
экземпляров. Это можно использовать для минимизации выделения при создании нескольких string
экземпляров из буферов или byte
значенийchar
. Он предоставляет механизм, который несколько похож string
на интернирование, с основными различиями в том, что пул настраивается, может быть сброшен с помощью политики лучших усилий и не требует предварительного создания экземпляров string
объектов, поэтому он может сохранять начальные выделения, а также при работе с временными буферами.
API платформы: StringPool
Синтаксис
Основной точкой входа является StringPool
его GetOrAdd(ReadOnlySpan<char>)
API, который возвращает string
экземпляр, соответствующий содержимому входных данных ReadOnlySpan<char>
, возможно, получение возвращаемого объекта из внутреннего пула.
Например, представьте, что у нас есть входные данные 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>
значения, используемого для подстановки. Это еще раз может значительно сократить количество выделений в зависимости от конкретного сценария использования.
Примеры
Дополнительные примеры можно найти в модульных тестах.
.NET Community Toolkit