StringPool
Der Typ StringPool implementiert einen konfigurierbaren Pool für string
-Instanzen. Dies kann verwendet werden, um Zuweisungen zu minimieren, wenn mehrere string
-Instanzen aus Puffern von char
- oder byte
-Werten erstellt werden. Er bietet einen Mechanismus, der der string
-Internalisierung, ähnlich ist. Der Hauptunterschied besteht darin, dass der Pool konfigurierbar ist, zurückgesetzt werden kann, mit einer Best-Effort-Richtlinie implementiert ist und keine string
-Objekte vorinstanziert werden müssen, so dass er auch bei der Arbeit mit temporären Puffern die anfänglichen Zuweisungen einsparen kann.
Plattform-APIs: StringPool
Syntax
Der Haupteinstiegspunkt für StringPool
ist seine GetOrAdd(ReadOnlySpan<char>)
-API, die eine string
-Instanz zurückgibt, die dem Inhalt der Eingabe ReadOnlySpan<char>
entspricht, wobei das zurückgegebene Objekt möglicherweise aus dem internen Pool stammt.
Angenommen, Sie haben eine Eingabe-string
, die die URL einer bestimmten Webanforderung darstellt, und es soll außerdem eine string
abgerufen werden, die nur den Hostnamen enthält. Wenn wir eine große Anzahl von Anforderungen für eine kleine Anzahl von Hosts erhalten, möchten wir diese string
-Instanzen möglicherweise zwischenspeichern. Das ist möglich, indem der Typ StringPool
wie folgt verwendet wird:
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);
}
Die oben beschriebene Methode führt überhaupt keine Zuweisungen durch, wenn die angeforderte string
bereits im Cache vorhanden ist, da die Suche nur mit einem ReadOnlySpan<char>
als Eingabe erfolgt, der eine Ansicht der Eingabe-URL string
darstellt.
Der Typ StringPool
kann auch hilfreich sein, wenn Rohanforderungen mithilfe einer anderen Codierung analysiert werden, z. B. UTF8. Es gibt eine GetOrAdd
-Überladung, die eine Eingabe ReadOnlySpan<byte>
und eine Encoding
-Instanz annimmt, die einen vom Pool bezogenen temporären Puffer verwendet, um einen ReadOnlySpan<char>
-Wert abzurufen, der für die Suche verwendet wird. Auch das kann die Anzahl der Zuweisungen je nach spezifischem Anwendungsfallszenario erheblich reduzieren.
Beispiele
Weitere Beispiele finden Sie in den Komponententests.
.NET Community Toolkit