コードインスペクション: パス文字列補間式
C# 6.0 で導入された文字列補間式機能の最大の欠点の一つは、文字列のフォーマットを効率的に遅延させて、補間文字列式の利用者に委譲できなかったことです。 実行時に ロギングレベルを変更できるロギングフレームワークでは、ロギングが無効化されている場合に頻繁なロギング呼び出しでリソースを無駄にしないことが重要です:
// works fast if the VERBOSE level is disabled
Logger.Verbose("info = {0}", objectWithSlowToString);
// always invokes 'objectWithSlowToString.ToString()', slow
Logger.Verbose($"info = {objectWithSlowToString}");
C# 10 は、補間された文字列ハンドラーの概念を導入することにより、この問題を修正します。 エンドユーザーにとって、これは、文字列補間式が一般に .NET 6 でより高速に機能し、補間ホールで Span<char> 値を使用できることを意味します。 ライブラリの作成者の場合、この機能を使用すると、文字列補間式を文字列に変換するかどうかを制御できます。
ReSharper は、ライブラリコード内の「補間文字列ハンドラー」パターンを認識し、可能な場合は文字列補間式を使用することを提案します:
public static class LoggerTest
{
public static void Test(String[] args)
{
// Pass string interpolation expression
Logger.Log("length = {0}", args.Length);
}
}
public static class LoggerTest
{
public static void Test(String[] args)
{
Logger.Log($"length = {args.Length}");
}
}
public static class Logger
{
[StringFormatMethod("format")]
public static void Log(string format, params object[] args)
{
// write to file
}
public static void Log(ref CustomInterpolatedStringHandler handler)
{
// write to file
}
[InterpolatedStringHandler]
public readonly struct CustomInterpolatedStringHandler
{
private readonly StringBuilder? _builder;
public CustomInterpolatedStringHandler(int literalLength, int formattedCount, out bool shouldAppend)
{
_builder = new StringBuilder(capacity: literalLength + formattedCount * 11);
shouldAppend = true;
}
public void AppendLiteral(string value) => _builder?.Append(value);
public void AppendFormatted<T>(T value) => _builder?.Append(value);
public void AppendFormatted(string? value) => _builder?.Append(value);
public override string? ToString() => _builder?.ToString();
}
}
2026 年 6 月 12 日