Freigeben über


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.