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 string
di 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.
.NET Community Toolkit