Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Il tipo StringPool implementa un pool configurabile per string le istanze. Usare questo pool per ridurre al minimo le allocazioni quando si creano più istanze di string da buffer di valori char o byte. Fornisce un meccanismo in qualche modo simile all'interningstring. Le differenze principali sono che il pool è configurabile, è possibile reimpostarlo, usa un criterio di lavoro ottimale e non richiede la creazione di oggetti preesistenti string . Può quindi salvare 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>) . Questa API restituisce un'istanza string che corrisponde al contenuto dell'input ReadOnlySpan<char>. L'API potrebbe ottenere 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 un string oggetto con solo il nome host. Se si ottiene un numero elevato di richieste, possibilmente per un numero ridotto di host, è possibile memorizzare nella cache tali string istanze. A tale scopo, 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 alloca affatto se l'oggetto richiesto string è già presente nella cache. La ricerca utilizza semplicemente un ReadOnlySpan<char> come input, che rappresenta una visualizzazione sull'URL string di input.
Il StringPool tipo può essere utile anche quando si analizzano le richieste non elaborate usando una codifica diversa, ad esempio UTF8. C'è un overload che accetta un GetOrAdd input ReadOnlySpan<byte> e un'istanza Encoding. Questo overload utilizza un buffer temporaneo noleggiato dal pool per recuperare un valore ReadOnlySpan<char> da usare per la ricerca. Questo approccio può 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