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.
.NET Community Toolkit