次の方法で共有


StringPool

StringPool 型は、string インスタンスの構成可能なプールを実装します。 これを使うと、char または byte 値のバッファーから複数の string インスタンスを作成するときに、割り当てを最小限に抑えることができます。 string のインターン処理と似たメカニズムを備えていますが、主な違いは、プールは構成可能であること、リセットできること、ベストエフォート ポリシーで実装されていること、string オブジェクトを事前にインスタンス化する必要がないことです。そのため、一時バッファーで作業するときにも初期割り当てを保存できます。

Platform API: StringPool

構文

StringPool の主なエントリ ポイントは、その GetOrAdd(ReadOnlySpan<char>) API です。これは、入力 ReadOnlySpan<char> の内容と一致する string インスタンスを返します。場合によっては、内部プールから返されたオブジェクトを取得することもできます。

たとえば、特定の Web 要求の URL を表す入力 string があり、ホスト名のみを含む string も取得する場合があるとします。 少数のホストに対して多数の要求を受け取った場合、それらの string インスタンスをキャッシュすることがあります。これを行うには、次のように StringPool 型を使います。

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

上記のメソッドは、要求された string が既にキャッシュに存在する場合、割り当てをまったく行いません。これは、入力 URL string のビューを表す ReadOnlySpan<char> のみを入力として使って検索が実行されるためです。

StringPool 型は、UTF8 などの別のエンコードを使って生の要求を解析する場合にも役立ちます。 入力 ReadOnlySpan<byte>Encoding インスタンスを受け取る GetOrAdd オーバーロードがあります。これは、プールから借用された一時バッファーを使い、検索に使う ReadOnlySpan<char> 値を取得します。 この場合も、特定のユース ケースのシナリオに応じて、割り当て数を大幅に減らすことができます。

単体テスト」では、さらに他の例を見つけることができます。