Quantcast
Channel: ++C++; // 未確認飛行 C
Viewing all articles
Browse latest Browse all 75

C# 10.0 の補間文字列の改善

$
0
0

概要

Ver. 10

C# 10.0 で、補完文字列(interpolated string)のコンパイル結果に変更が掛かって、 これまでよりもかなり高速化されました。 詳細は気にせず単に高速化の恩恵だけを受けたい場合、 言語バージョン、SDK バージョンを C# 10.0/.NET 6.0 にアップデートして再コンパイルするだけで速くなります。

一方、本項では、 C# 9.0 までの補間文字列の問題点と、 C# 10.0 から補間文字列がどのように展開されるかについて説明します。 仕組みがわかれば、補間文字列の解釈を結構自由にカスタマイズすることができます。

C# 9.0 までの補間文字列

例えば以下のようなコードがあったとします。

static string m(int a, int b, int c, int d) => $"{a}.{b}.{c}.{d}";

C# 9.0 までは、このコードは以下のように展開されていました。

static string m(int a, int b, int c, int d) => string.Format("{0}.{1}.{2}.{3}", a, b, c, d);

要は string.Format メソッド呼び出しへの展開でした。 ちなみに、ここで呼ばれている Format メソッドは以下のようなオーバーロードです。

Format(public static string format, params object?[] args)

この展開方法では以下のようなコストがどうしても避けられず、用途によっては使うのがためらわれていました。

  • params を介していて、new object[4] のコストが発生する
  • object を介していて、int などの値を渡すとボックス化 のコストが発生する
  • (ログレベルの変更などで)実際には文字列を全く使わない状況でも必ず文字列インスタンスが作られる
  • Span 構造体を渡せない

Viewing all articles
Browse latest Browse all 75

Latest Images

Trending Articles