StringPool
Typ StringPool implementuje konfigurovatelný fond pro string
instance. To se dá použít k minimalizaci přidělení při vytváření více string
instancí z vyrovnávací paměti char
nebo byte
hodnot. Poskytuje mechanismus, který je trochu podobný string
prokládání, s hlavními rozdíly v tom, že fond je konfigurovatelný, lze resetovat, je implementován se zásadami nejlepšího úsilí a nevyžaduje vytvoření string
instance objektů, takže může uložit počáteční přidělení i při práci na dočasných vyrovnávacích pamětích.
Rozhraní API platformy: StringPool
Syntaxe
Hlavním vstupním bodem pro StringPool
je jeho GetOrAdd(ReadOnlySpan<char>)
rozhraní API, které vrací string
instanci odpovídající obsahu vstupu ReadOnlySpan<char>
, pravděpodobně získání vráceného objektu z interního fondu.
Představte si například, že máme vstup string
představující adresu URL daného webového požadavku a chceme také načíst string
pouze název hostitele. Pokud získáme velký počet požadavků na malý počet hostitelů, můžeme tyto instance uložit do mezipaměti string
, můžeme to udělat následujícím StringPool
způsobem:
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);
}
Výše uvedená metoda vůbec nepřiděluje žádné přidělení, pokud je požadovaná string
již v mezipaměti, protože vyhledávání se provádí stejně ReadOnlySpan<char>
jako vstup, který představuje zobrazení na vstupní adrese URL string
.
Typ StringPool
může být také užitečný při analýze nezpracovaných požadavků pomocí jiného kódování, například UTF8. GetOrAdd
Existuje přetížení, které přebírá vstup ReadOnlySpan<byte>
a Encoding
instanci, která používá dočasnou vyrovnávací paměť pronajmutou z fondu k načtení ReadOnlySpan<char>
hodnoty, která se má použít pro vyhledávání. To může výrazně snížit počet přidělení v závislosti na konkrétním scénáři použití.
Příklady
.NET Community Toolkit