Compartir a través de


StringPool

El tipo StringPool implementa un grupo configurable para string instancias. Esto se puede usar para minimizar las asignaciones al crear varias instancias de string a partir de búferes de valores de char o byte. Proporciona un mecanismo que es algo similar a string interning , con las principales diferencias de que el pool es configurable, puede ser reiniciado, se implementa con una política de best-effort y no requiere pre-instanciar objetos string, por lo que puede guardar las asignaciones iniciales también cuando se trabaja en buffers temporales.

API de plataforma: StringPool

Sintaxis

El punto de entrada principal de StringPool es su API de GetOrAdd(ReadOnlySpan<char>), que devuelve una instancia de string que coincide con el contenido de la entrada ReadOnlySpan<char>, posiblemente obteniendo el objeto devuelto del grupo interno.

Por ejemplo, imagine que tenemos una entrada string que representa la dirección URL de una solicitud web determinada y también queremos recuperar un string con solo el nombre de host. Si obtenemos un gran número de solicitudes posiblemente para un pequeño número de hosts, es posible que deseemos almacenar en caché esas string instancias, podemos hacerlo mediante el tipo StringPool como se indica a continuación:

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);
}

El método anterior no realiza asignaciones en absoluto si la solicitud string ya está presente en la memoria caché, ya que la búsqueda se realiza con solo una ReadOnlySpan<char> entrada, que representa una vista en la dirección URL de entrada string.

El tipo StringPool también puede ser útil al analizar solicitudes sin procesar mediante una codificación diferente, por ejemplo, UTF8. Hay una GetOrAdd sobrecarga que toma una entrada ReadOnlySpan<byte> y una instancia Encoding, que usa un búfer temporal alquilado desde el grupo para recuperar un valor ReadOnlySpan<char> que se usará para la búsqueda. De nuevo, esto puede reducir considerablemente el número de asignaciones en función del escenario de caso de uso específico.

Ejemplos

Encontrará más ejemplos en las pruebas unitarias.