StringPool
O tipo StringPool implementa um pool configurável para instâncias de string
. Isso pode ser usado para minimizar alocações ao criar várias instâncias de string
a partir de buffers de valores char
ou byte
. Ele fornece um mecanismo um pouco semelhante à string
centralização, com as principais diferenças sendo que o pool é configurável, pode ser redefinido, é implementado com uma política de melhor esforço e não requer a pré-instanciação de objetos string
, para que ele possa salvar as alocações iniciais também ao trabalhar em buffers temporários.
APIs de plataforma: StringPool
Sintaxe
O principal ponto de entrada para StringPool
é a API GetOrAdd(ReadOnlySpan<char>)
, que retorna uma instância string
que corresponde ao conteúdo de entrada ReadOnlySpan<char>
, possivelmente obtendo o objeto retornado do pool interno.
Por exemplo, imagine que temos um string
de entrada que representa a URL de uma determinada solicitação da Web e também queremos recuperar um string
apenas com o nome do host. Se recebermos um grande número de solicitações possivelmente para um pequeno número de hosts, talvez queiramos armazenar em cache essas instâncias string
, podemos fazer isso usando o tipo StringPool
da seguinte maneira:
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);
}
O método acima não fará nenhuma alocação se a string
solicitada já estiver presente no cache, pois a pesquisa é feita com apenas uma ReadOnlySpan<char>
como entrada, representando uma exibição na URL de entrada string
.
O tipo StringPool
também pode ser útil ao analisar solicitações brutas usando uma codificação diferente, por exemplo, UTF8. Há uma sobrecarga GetOrAdd
que usa uma ReadOnlySpan<byte>
de entrada e uma instância de Encoding
, que usa um buffer temporário alugado do pool para recuperar um valor ReadOnlySpan<char>
a ser usado para a pesquisa. Isso novamente pode reduzir consideravelmente o número de alocações, dependendo do cenário específico do caso de uso.
Exemplos
Você pode encontrar mais exemplos nos testes de unidade.
.NET Community Toolkit