$ - 文字列補間 (C# リファレンス)

$ 特殊文字は、リテラル文字列を 挿入文字列 として識別します。 挿入文字列は、補間式 が含まれている可能性がある文字列リテラルです。 挿入文字列が結果の文字列に解決されると、補間式を含む項目は、式の結果の文字列表現によって置き換えられます。 この機能は、C# 6 以降で使用できます。

文字列補間では、複合文字列の書式設定機能よりも読み取りやすく便利な構文を使用して書式指定された文字列を作成できます。 次の例では、両方の機能を使用して、同じ出力を生成します。

string name = "Mark";
var date = DateTime.Now;

// Composite formatting:
Console.WriteLine("Hello, {0}! Today is {1}, it's {2:HH:mm} now.", name, date.DayOfWeek, date);
// String interpolation:
Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now.");
// Both calls produce the same output that is similar to:
// Hello, Mark! Today is Wednesday, it's 19:40 now.

挿入文字列の構造

文字列リテラルを挿入文字列として識別するため、先頭に $ の記号を追加してください。 $ と文字列リテラルを開始する " の間に空白を入れることはできません。

補間式を含む項目の構造は、次のとおりです。

{<interpolationExpression>[,<alignment>][:<formatString>]}

角かっこ内の要素は省略可能です。 次の表は、それぞれの要素の説明です。

要素 説明
interpolationExpression 書式設定される結果を生成する式です。 null の文字列表記は String.Empty です。
alignment 式の結果の文字列表現で、最小文字数を定義する値を持つ定数式です。 正の場合は、文字列表現は右揃えで配置され、負の場合は、左揃えで配置されます。 詳細については、「Alignment コンポーネント」を参照してください。
formatString 式の結果の型によってサポートされる書式指定文字列です。 詳細については、「Format String コンポーネント」を参照してください。

次の例では、前述したオプションの書式設定コンポーネントを使用します。

Console.WriteLine($"|{"Left",-7}|{"Right",7}|");

const int FieldWidthRightAligned = 20;
Console.WriteLine($"{Math.PI,FieldWidthRightAligned} - default formatting of the pi number");
Console.WriteLine($"{Math.PI,FieldWidthRightAligned:F3} - display only three decimal digits of the pi number");
// Expected output is:
// |Left   |  Right|
//     3.14159265358979 - default formatting of the pi number
//                3.142 - display only three decimal digits of the pi number

C# 10 以降では、プレースホルダーに使用されるすべての式が定数文字列である場合も、文字列補間を使用して定数文字列を初期化できます。 つまり、すべての "補間式" は文字列である必要があり、コンパイル時には定数である必要があります。

特殊文字

挿入文字列で生成された文字列にかっこ "{" または "}" を含めるには、2 つのかっこ "{{" または "}}" を使用します。 詳細については、「エスケープ中かっこ ({})」を参照してください。

コロン (":") が補間式の項目で特別な意味を持つときに、補間式で条件演算子を使用するには、その式を丸かっこで囲みます。

次の例では、かっこを結果の文字列に含める方法、および補間式で条件演算子を使用する方法を示します。

string name = "Horace";
int age = 34;
Console.WriteLine($"He asked, \"Is your name {name}?\", but didn't wait for a reply :-{{");
Console.WriteLine($"{name} is {age} year{(age == 1 ? "" : "s")} old.");
// Expected output is:
// He asked, "Is your name Horace?", but didn't wait for a reply :-{
// Horace is 34 years old.

verbatim 補間文字列は、$ 文字で始まり、@ 文字が続きます。 逐語的文字列の詳細については、string逐語的識別子に関するトピックを参照してください。

注意

C# 8.0 以降では、$@ のトークンを任意の順序で使用できます。$@"..."@$"..." はどちらも有効な verbatim 補間文字列です。 以前のバージョンの C# では、$ トークンは @ トークンの前に記述する必要があります。

暗黙的な変換と IFormatProvider 実装の指定方法

挿入文字列から暗黙の変換を行う方法は 3 種類あります。

  1. 挿入文字列から String インスタンスへの変換。これは、適切に書式設定された文字列表現の結果で置き換えられる、補間式の項目を含む挿入文字列分析の結果です。 この変換では CurrentCulture を使用して、式の結果の書式を設定します。

  2. 書式設定される式の結果と、挿入文字列から複合書式指定文字列を表す FormattableString インスタンスへの変換。 これは、単一の FormattableString インスタンスから、カルチャ固有のコンテンツを持つ複数の結果文字列の作成を可能にするものです。 そのためには、次のいずれかのメソッドを呼び出します。

    ToString(IFormatProvider) メソッドを使用して、カスタム書式設定をサポートする IFormatProvider インターフェイスのユーザー定義の実装を提供することもできます。 詳細については、「ICustomFormatter を使用したカスタム書式設定」の「.NET での書式設定」のセクションを参照してください。

  3. 挿入文字列から IFormattable インスタンスへの変換。これは、単一の IFormattable インスタンスから、カルチャ固有のコンテンツを持つ複数の結果文字列の作成も可能にするものです。

次の例では、カルチャ固有の結果の文字列を作成するために、FormattableString への暗黙の変換を使用します。

double speedOfLight = 299792.458;
FormattableString message = $"The speed of light is {speedOfLight:N3} km/s.";

System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("nl-NL");
string messageInCurrentCulture = message.ToString();

var specificCulture = System.Globalization.CultureInfo.GetCultureInfo("en-IN");
string messageInSpecificCulture = message.ToString(specificCulture);

string messageInInvariantCulture = FormattableString.Invariant(message);

Console.WriteLine($"{System.Globalization.CultureInfo.CurrentCulture,-10} {messageInCurrentCulture}");
Console.WriteLine($"{specificCulture,-10} {messageInSpecificCulture}");
Console.WriteLine($"{"Invariant",-10} {messageInInvariantCulture}");
// Expected output is:
// nl-NL      The speed of light is 299.792,458 km/s.
// en-IN      The speed of light is 2,99,792.458 km/s.
// Invariant  The speed of light is 299,792.458 km/s.

その他の技術情報

文字列補間を初めてお使いの場合は、C# の文字列補完に関する対話形式チュートリアルを参照してください。 また、補間された文字列を使用して書式設定された文字列を生成する方法を示したもう 1 つのチュートリアル「C# における文字列補間」を確認することもできます。

補完文字列のコンパイル

補完文字列が string 型の場合、通常は String.Format メソッドの呼び出しに変換されます。 分析後の動作が連結と等しくなるようであれば、コンパイラでは、String.FormatString.Concat に置換する場合があります。

補間文字列の型が IFormattable または FormattableString の場合、コンパイラは FormattableStringFactory.Create メソッドの呼び出しを生成します。

C# 言語仕様

詳しくは、C# 言語仕様に関するページの補完文字列のセクションを参照してください。

関連項目