Kelas StringPool

Jenis StringPool mengimplementasikan kumpulan yang dapat dikonfigurasi untuk string instans. Gunakan kolam ini untuk meminimalkan alokasi ketika Anda membuat beberapa instance string dari buffer nilai char atau byte. Ini menyediakan mekanisme yang agak mirip dengan string interning. Perbedaan utamanya adalah bahwa kumpulan ini dapat dikonfigurasi, Anda dapat meresetnya, ia menggunakan kebijakan best-effort, dan tidak memerlukan objek yang diprainisialisasi string. Jadi, fungsi ini dapat menyimpan kapasitas memori awal saat bekerja pada buffer sementara.

API Platform:StringPool

Sintaks

Titik masuk utama untuk StringPool adalah API-nya GetOrAdd(ReadOnlySpan<char>) . API ini mengembalikan instans string yang cocok dengan konten input ReadOnlySpan<char>. API mungkin mendapatkan objek yang dikembalikan dari kumpulan internal.

Misalnya, bayangkan Anda memiliki input string yang mewakili URL permintaan web tertentu, dan Anda ingin mengambil string hanya dengan nama host. Jika Anda mendapatkan sejumlah besar permintaan, mungkin untuk sejumlah kecil host, Anda mungkin ingin melakukan cache instance tersebut string. Anda dapat melakukannya dengan menggunakan StringPool jenis sebagai berikut:

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

Metode sebelumnya tidak mengalokasikan sama sekali jika yang diminta string sudah ada di cache. Pencarian hanya menggunakan ReadOnlySpan<char> sebagai input, yang mewakili tampilan pada URL input string.

Tipe ini StringPool juga dapat berguna saat mengurai permintaan mentah dengan menggunakan pengodean yang berbeda, seperti UTF8. Ada GetOrAdd kelebihan beban yang mengambil input ReadOnlySpan<byte> dan Encoding instans. Kelebihan beban ini menggunakan buffer sementara yang disewa dari kumpulan untuk mengambil nilai yang ReadOnlySpan<char> akan digunakan untuk pencarian. Pendekatan ini dapat sangat mengurangi jumlah alokasi tergantung pada skenario kasus penggunaan spesifik Anda.

Contoh

Anda dapat menemukan lebih banyak contoh dalam pengujian unit.