Partilhar via


Classe StringPool

O tipo StringPool implementa um pool configurável para string. Use este pool para minimizar alocações quando criar múltiplas instâncias de string a partir de buffers de valores de char ou byte. Proporciona um mecanismo algo semelhante ao string internamento. As principais diferenças são que o pool é configurável, pode reiniciá-lo, usa uma política de melhor esforço e não requer pré-instanciação string de objetos. Assim, é possível salvar as alocações iniciais ao trabalhar com buffers temporários.

APIs da Plataforma:StringPool

Sintaxe

O principal ponto de entrada para StringPool é a sua API GetOrAdd(ReadOnlySpan<char>). Esta API devolve uma string instância que corresponde ao conteúdo da entrada ReadOnlySpan<char>. A API pode obter o objeto devolvido do pool interno.

Por exemplo, imagine que tem uma entrada string que representa a URL de um determinado pedido web, e quer recuperar um string apenas com o nome do host. Se receber um grande número de pedidos, possivelmente para um pequeno número de hosts, pode querer armazenar essas string instâncias em cache. Pode fazê-lo usando o StringPool tipo da seguinte forma:

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 anterior não aloca nada se o pedido string já estiver presente na cache. A consulta usa apenas ReadOnlySpan<char> como entrada, que representa uma visualização da URL string de entrada.

O StringPool tipo também pode ser útil quando analisa pedidos brutos usando uma codificação diferente, como UTF8. Há uma GetOrAdd sobrecarga que requer uma entrada ReadOnlySpan<byte> e uma Encoding instância. Esta sobrecarga utiliza um buffer temporário obtido do pool para recuperar um valor ReadOnlySpan<char> a usar na consulta. Esta abordagem pode reduzir significativamente o número de alocações, dependendo do seu caso de uso específico.

Exemplos

Podes encontrar mais exemplos nos testes unitários.