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

$ 特殊文字は、リテラル文字列を挿入文字列として識別します。The $ special character identifies a string literal as an interpolated string. 挿入文字列は、補間式が含まれている可能性がある文字列リテラルです。An interpolated string is a string literal that might contain interpolation expressions. 挿入文字列が結果の文字列に解決されると、補間式を含む項目は、式の結果の文字列表現によって置き換えられます。When an interpolated string is resolved to a result string, items with interpolation expressions are replaced by the string representations of the expression results. この機能は C# 6 以降のバージョンの言語で使用できます。This feature is available in C# 6 and later versions of the language.

文字列補間では、複合文字列の書式設定機能よりも読み取りやすく便利な構文を使用して書式指定された文字列を作成できます。String interpolation provides a more readable and convenient syntax to create formatted strings than a string composite formatting feature. 次の例では、両方の機能を使用して、同じ出力を生成します。The following example uses both features to produce the same output:

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.

挿入文字列の構造Structure of an interpolated string

文字列リテラルを挿入文字列として識別するため、先頭に $ の記号を追加してください。To identify a string literal as an interpolated string, prepend it with the $ symbol. $ と文字列リテラルを開始する " の間に空白を入れることはできません。You cannot have any white space between the $ and the " that starts a string literal. 空白を入れると、コンパイル時エラーが発生します。Doing so causes a compile-time error.

補間式を含む項目の構造は、次のとおりです。The structure of an item with an interpolation expression is as follows:

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

角かっこ内の要素は省略可能です。Elements in square brackets are optional. 次の表は、それぞれの要素の説明です。The following table describes each element:

要素Element 説明Description
interpolationExpression 書式設定される結果を生成する式です。The expression that produces a result to be formatted. null 結果の文字列表現は、String.Empty です。String representation of the null result is String.Empty.
alignment 補間式の結果の文字列表現で、最小文字数を定義する値を持つ定数式です。The constant expression whose value defines the minimum number of characters in the string representation of the result of the interpolation expression. 正の場合は、文字列表現は右揃えで配置され、負の場合は、左揃えで配置されます。If positive, the string representation is right-aligned; if negative, it's left-aligned. 詳細については、「Alignment コンポーネント」を参照してください。For more information, see Alignment Component.
formatString 式の結果の型によってサポートされる書式指定文字列です。A format string that is supported by the type of the expression result. 詳細については、「Format String コンポーネント」を参照してください。For more information, see Format String Component.

次の例では、前述したオプションの書式設定コンポーネントを使用します。The following example uses optional formatting components described above:

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    

特殊文字Special characters

挿入文字列で生成された文字列にかっこ "{" または "}" を含めるには、2 つのかっこ "{{" または "}}" を使用します。To include a brace, "{" or "}", in the text produced by an interpolated string, use two braces, "{{" or "}}". 詳細については、「エスケープ中かっこ ({})」を参照してください。For more information, see Escaping Braces.

コロン (":") が補間式の項目で特別な意味を持つときに、補間式で条件演算子を使用するには、その式を丸かっこで囲みます。As the colon (":") has special meaning in an interpolation expression item, in order to use a conditional operator in an interpolation expression, enclose that expression in parentheses.

次の例では、かっこを結果の文字列に含める方法、および補間式で条件演算子を使用する方法を示します。The following example shows how to include a brace in a result string and how to use a conditional operator in an interpolation expression:

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.

逐語的挿入文字列は、@ 文字が続く $ 文字で始まります。A verbatim interpolated string starts with the $ character followed by the @ character. 逐語的文字列の詳細については、string逐語的識別子に関するトピックを参照してください。For more information about verbatim strings, see the string and verbatim identifier topics.

注意

$ トークンは、逐語的挿入文字列の @ トークンの前に置く必要があります。The $ token must appear before the @ token in a verbatim interpolated string.

暗黙的な変換と IFormatProvider 実装の指定Implicit conversions and specifying IFormatProvider implementation

挿入文字列から暗黙の変換を行う方法は 3 種類あります。There are three implicit conversions from an interpolated string:

  1. 挿入文字列から String インスタンスへの変換。これは、適切に書式設定された文字列表現の結果で置き換えられる、補間式の項目を含む挿入文字列分析の結果です。Conversion of an interpolated string to a String instance that is the result of interpolated string resolution with interpolation expression items being replaced with the properly formatted string representations of their results. この変換では、現在のカルチャを使用します。This conversion uses the current culture.

  2. 書式設定される式の結果と、挿入文字列から複合書式指定文字列を表す FormattableString インスタンスへの変換。Conversion of an interpolated string to a FormattableString instance that represents a composite format string along with the expression results to be formatted. これは、単一の FormattableString インスタンスから、カルチャ固有のコンテンツを持つ複数の結果文字列の作成を可能にするものです。That allows you to create multiple result strings with culture-specific content from a single FormattableString instance. そのためには、次のいずれかのメソッドを呼び出します。To do that call one of the following methods:

    ToString(IFormatProvider) メソッドを使用して、カスタム書式設定をサポートする IFormatProvider インターフェイスのユーザー定義の実装を提供することもできます。You also can use the ToString(IFormatProvider) method to provide a user-defined implementation of the IFormatProvider interface that supports custom formatting. 詳細については、「ICustomFormatter を使用したカスタム書式設定」を参照してください。For more information, see Custom Formatting with ICustomFormatter.

  3. 挿入文字列から IFormattable インスタンスへの変換。これは、単一の IFormattable インスタンスから、カルチャ固有のコンテンツを持つ複数の結果文字列の作成も可能にするものです。Conversion of an interpolated string to an IFormattable instance that also allows you to create multiple result strings with culture-specific content from a single IFormattable instance.

次の例では、カルチャ固有の結果の文字列を作成するために、FormattableString への暗黙の変換を使用します。The following example uses implicit conversion to FormattableString to create culture-specific result strings:

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.

その他の技術情報Additional resources

文字列補間を初めてお使いの場合は、C# の文字列補完に関する対話形式チュートリアルを参照してください。If you are new to string interpolation, see the String interpolation in C# interactive tutorial. また、補完された文字列を使用して書式設定された文字列を生成する方法を示したもう 1 つのチュートリアル「C# における文字列補完」も確認してください。You also can check another String interpolation in C# tutorial that demonstrates how to use interpolated strings to produce formatted strings.

補完文字列のコンパイルCompilation of interpolated strings

補完文字列が string 型の場合、通常は String.Format メソッドの呼び出しに変換されます。If an interpolated string has the type string, it's typically transformed into a String.Format method call. 分析後の動作が連結と等しくなるようであれば、コンパイラでは、String.FormatString.Concat に置換する場合があります。The compiler may replace String.Format with String.Concat if the analyzed behavior would be equivalent to concatenation.

補間文字列の型が IFormattable または FormattableString の場合、コンパイラは FormattableStringFactory.Create メソッドの呼び出しを生成します。If an interpolated string has the type IFormattable or FormattableString, the compiler generates a call to the FormattableStringFactory.Create method.

C# 言語仕様C# language specification

詳しくは、C# 言語仕様に関するページの補完文字列のセクションを参照してください。For more information, see the Interpolated strings section of the C# language specification.

関連項目See also