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>
値を取得します。 この場合も、特定のユース ケースのシナリオに応じて、割り当て数を大幅に減らすことができます。
例
「単体テスト」では、さらに他の例を見つけることができます。
.NET Community Toolkit