Condividi tramite


StringPool

Il tipo StringPool implementa un pool configurabile per string le istanze. Questa operazione può essere usata per ridurre al minimo le allocazioni durante la creazione di più string istanze da buffer di char valori o byte . Fornisce un meccanismo simile all'internizzazionestring, con le principali differenze che il pool è configurabile, può essere reimpostato, viene implementato con un criterio con il massimo sforzo e non richiede la pre-creazione di istanze degli string oggetti, in modo da poter salvare anche le allocazioni iniziali quando si lavora su buffer temporanei.

API della piattaforma: StringPool

Sintassi

Il punto di ingresso principale per StringPool è l'API GetOrAdd(ReadOnlySpan<char>) , che restituisce un'istanza string corrispondente al contenuto dell'input ReadOnlySpan<char>, possibilmente ottenendo l'oggetto restituito dal pool interno.

Si supponga, ad esempio, di avere un input string che rappresenta l'URL di una determinata richiesta Web e di voler recuperare anche un string oggetto con solo il nome host. Se si ottiene un numero elevato di richieste per un numero ridotto di host, è possibile memorizzare nella cache tali string istanze, è possibile usare il StringPool tipo come segue:

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);
}

Il metodo precedente non esegue alcuna allocazione se l'oggetto richiesto string è già presente nella cache, perché la ricerca viene eseguita con un solo ReadOnlySpan<char> input, che rappresenta una visualizzazione nell'URL stringdi input .

Il StringPool tipo può essere utile anche durante l'analisi delle richieste non elaborate usando una codifica diversa, ad esempio UTF8. Esiste un overload che accetta un GetOrAdd input ReadOnlySpan<byte> e un'istanza Encoding , che usa un buffer temporaneo affittato dal pool per recuperare un ReadOnlySpan<char> valore da usare per la ricerca. Questo può anche ridurre notevolmente il numero di allocazioni a seconda dello scenario specifico del caso d'uso.

Esempi

Altri esempi sono disponibili negli unit test.