Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Typ StringPool implementuje konfigurowalną pulę dla string wystąpień. Może to służyć do zminimalizowania alokacji podczas tworzenia wielu string wystąpień z char lub byte wartości. Zapewnia mechanizm, który jest nieco podobny do string interningu, z główną różnicą polegającą na tym, że pula jest konfigurowalna, można zresetować, jest implementowana przy użyciu zasad najlepszego nakładu pracy i nie wymaga wstępnego tworzenia wystąpień string obiektów, dzięki czemu może zapisywać początkowe alokacje, a także podczas pracy z tymczasowymi.
Interfejsy API platformy: StringPool
Składnia
Głównym punktem StringPool wejścia jest jego GetOrAdd(ReadOnlySpan<char>) interfejs API, który zwraca wystąpienie zgodne z zawartością string danych wejściowych ReadOnlySpan<char>, prawdopodobnie uzyskanie zwróconego obiektu z puli wewnętrznej.
Załóżmy na przykład, że mamy dane wejściowe string reprezentujące adres URL danego żądania internetowego i chcemy również pobrać string element z nazwą hosta. Jeśli uzyskamy dużą liczbę żądań dla niewielkiej liczby hostów, możemy chcieć buforować te string wystąpienia, możemy to zrobić przy użyciu StringPool typu w następujący sposób:
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);
}
W powyższej metodzie nie ma żadnych alokacji, jeśli żądany string element znajduje się już w pamięci podręcznej, ponieważ wyszukiwanie odbywa się przy użyciu tylko ReadOnlySpan<char> jako danych wejściowych, reprezentując widok w wejściowym adresie URL string.
Typ StringPool może być również przydatny podczas analizowania nieprzetworzonych żądań przy użyciu innego kodowania, na przykład UTF8. GetOrAdd Istnieje przeciążenie, które pobiera dane wejściowe ReadOnlySpan<byte> i Encoding wystąpienie, które używa tymczasowego buforu wynajętego z puli w celu pobrania ReadOnlySpan<char> wartości do użycia dla wyszukiwania. To ponownie może znacznie zmniejszyć liczbę alokacji w zależności od konkretnego scenariusza przypadku użycia.
Przykłady
.NET Community Toolkit