Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le type StringPool implémente un pool configurable pour les instances string. Vous pouvez l’utiliser pour réduire les allocations lors de la création de plusieurs instances string à partir de mémoires tampons de char ou byte valeurs. Son mécanisme est un peu similaire à stringla centralisation, aux principales différences près que le pool est configurable, peut être réinitialisé, est implémenté avec une stratégie du meilleur effort et ne nécessite pas de pré-instancier des objets string, afin qu’il puisse enregistrer les allocations initiales aussi lorsque vous travaillez sur des mémoires tampons temporaires.
API de plateforme : StringPool
Syntaxe
Le point d’entrée principal de StringPool est son API GetOrAdd(ReadOnlySpan<char>), qui retourne une instance string correspondant au contenu de l’entrée ReadOnlySpan<char>, et obtenant peut-être l’objet retourné à partir du pool interne.
Par exemple, imaginez que nous ayons une entrée string représentant l’URL d’une requête web donnée et que nous voulions également récupérer un string à partir du nom d’hôte uniquement. Si nous obtenons un grand nombre de requêtes, éventuellement pour un petit nombre d’hôtes, nous pouvons mettre en cache ces instances string à l’aide du type StringPool comme suit :
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);
}
La méthode ci-dessus ne fait aucune allocation du tout si le string demandé est déjà présent dans le cache, car la recherche est effectuée avec juste une entrée ReadOnlySpan<char>, représentant une vue sur l’URL d’entrée string.
Le type StringPool peut également être utile lors de l’analyse des requêtes brutes à l’aide d’un encodage différent, par exemple UTF8. Il existe une surcharge GetOrAdd qui prend une entrée ReadOnlySpan<byte> et une instance Encoding, cette dernière utilisant une mémoire tampon temporaire louée à partir du pool pour récupérer une valeur ReadOnlySpan<char> à utiliser pour la recherche. Cela peut à nouveau réduire considérablement le nombre d’allocations en fonction du scénario de cas d’usage spécifique.
Exemples
Vous trouverez d’autres exemples dans les tests unitaires.
.NET Community Toolkit