JetBrains Rider 2024.1 ヘルプ

コード検査: パス文字列補間式

C# 6.0 で導入された文字列補間式機能の最大の欠点の 1 つは、文字列のフォーマットを効率的に遅延させ、補間された文字列式のコンシューマーに委譲できないことでした。これは、実行時にロギングレベルを変更できるロギングフレームワークで重要です。この場合、ロギングが無効になっているときに頻繁なロギング呼び出しでリソースを浪費したくありません。

// 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> 値を使用できることを意味します。ライブラリの作成者の場合、この機能を使用すると、文字列補間式を文字列に変換するかどうかを制御できます。

JetBrains Rider は、ライブラリコード内の「補間文字列ハンドラー」パターンを認識し、可能な場合には文字列補間式を使用することを提案します。

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