Compartilhar via


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 à stringcentralizaçã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 da 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 teste de unidade.