C# における文字列補間String interpolation in C#

このチュートリアルは、文字列補間を使用して結果文字列に式の結果を書式設定したものを含める方法を示しています。This tutorial shows you how to use string interpolation to format and include expression results in a result string. 例では、基本的な C# の概念と .NET の型の書式設定について理解していることを前提としています。The examples assume that you are familiar with basic C# concepts and .NET type formatting. 文字列補間や .NET の型の書式設定の経験がない場合は、最初に対話型の文字列補間に関するチュートリアルを参照してください。If you are new to string interpolation or .NET type formatting, check out the interactive string interpolation tutorial first. .NET の型の書式設定の詳細については、「.NET での型の書式設定」のトピックを参照してください。For more information about formatting types in .NET, see the Formatting Types in .NET topic.

注意

この記事の C# 例は、Try.NET インライン コード ランナーとプレイグラウンドで実行されます。The C# examples in this article run in the Try.NET inline code runner and playground. [実行] ボタンを選択すると、対話型ウィンドウで例が実行されます。Select the Run button to run an example in an interactive window. コードを実行したら、コードを変更し、 [実行] をもう一度選択して変更後のコードを実行できます。Once you execute the code, you can modify it and run the modified code by selecting Run again. 変更後のコードが対話型ウィンドウで実行されるか、コンパイルできなかった場合、対話型ウィンドウにすべての C# コンパイラ エラー メッセージが表示されます。The modified code either runs in the interactive window or, if compilation fails, the interactive window displays all C# compiler error messages.

はじめにIntroduction

文字列補間機能は、複合書式設定機能の上に構築されていて、結果文字列に書式設定された式の結果を含めるためのより読みやすく、便利な構文を提供します。The string interpolation feature is built on top of the composite formatting feature and provides a more readable and convenient syntax to include formatted expression results in a result string.

文字列リテラルを挿入文字列として識別するため、先頭に $ の記号を追加してください。To identify a string literal as an interpolated string, prepend it with the $ symbol. 挿入文字列の値を返す、有効な C# の式を埋め込むことができます。You can embed any valid C# expression that returns a value in an interpolated string. 次の例では、式が評価されるとすぐにその結果が文字列に変換され、結果文字列に含まれています。In the following example, as soon as an expression is evaluated, its result is converted into a string and included in a result string:

double a = 3;
double b = 4;
Console.WriteLine($"Area of the right triangle with legs of {a} and {b} is {0.5 * a * b}");
Console.WriteLine($"Length of the hypotenuse of the right triangle with legs of {a} and {b} is {CalculateHypotenuse(a, b)}");

double CalculateHypotenuse(double leg1, double leg2) => Math.Sqrt(leg1 * leg1 + leg2 * leg2);

// Expected output:
// Area of the right triangle with legs of 3 and 4 is 6
// Length of the hypotenuse of the right triangle with legs of 3 and 4 is 5

例に示すように、式を中かっこで囲むことで挿入文字列に含めることができます。As the example shows, you include an expression in an interpolated string by enclosing it with braces:

{<interpolationExpression>}

挿入文字列では、文字列の複合書式設定機能に含まれるすべての機能がサポートされます。Interpolated strings support all the capabilities of the string composite formatting feature. そのため、String.Format メソッドを使用するよりも読みやすい代替手法になります。That makes them a more readable alternative to the use of the String.Format method.

補間式の書式設定文字列を指定する方法How to specify a format string for an interpolation expression

コロン (":") と書式設定文字列を持つ補間式に従って、式の結果の型でサポートされる書式設定文字列を指定します。You specify a format string that is supported by the type of the expression result by following the interpolation expression with a colon (":") and the format string:

{<interpolationExpression>:<formatString>}

次の例は、日時や数値による結果を生成する式の標準とカスタムの書式設定文字列を指定する方法を示しています。The following example shows how to specify standard and custom format strings for expressions that produce date and time or numeric results:

var date = new DateTime(1731, 11, 25);
Console.WriteLine($"On {date:dddd, MMMM dd, yyyy} Leonhard Euler introduced the letter e to denote {Math.E:F5} in a letter to Christian Goldbach.");

// Expected output:
// On Sunday, November 25, 1731 Leonhard Euler introduced the letter e to denote 2.71828 in a letter to Christian Goldbach.

詳細については、「複合書式設定」トピックの「Format String コンポーネント」のセクションを参照してください。For more information, see the Format String Component section of the Composite Formatting topic. このセクションでは、.NET の基本データ型でサポートされる標準とカスタムの書式設定文字列について説明するトピックへのリンクを提供しています。That section provides links to the topics that describe standard and custom format strings supported by .NET base types.

書式設定された補間式のフィールドの幅と配置を制御する方法How to control the field width and alignment of the formatted interpolation expression

コンマ (",") と定数式を持つ補間式に従って、書式設定された式の結果の最小フィールド幅と配置を指定します。You specify the minimum field width and the alignment of the formatted expression result by following the interpolation expression with a comma (",") and the constant expression:

{<interpolationExpression>,<alignment>}

alignment の値が正の値である場合、書式設定された式の結果は右揃えになります。負の値である場合は、左揃えになります。If the alignment value is positive, the formatted expression result is right-aligned; if negative, it's left-aligned.

配置と書式設定文字列の両方を指定する必要がある場合は、alignment コンポーネントから開始します。If you need to specify both alignment and a format string, start with the alignment component:

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

次の例は、配置を指定する方法を示し、テキスト フィールドを区切るためにパイプ文字 ("|") を使用しています。The following example shows how to specify alignment and uses pipe characters ("|") to delimit text fields:

const int NameAlignment = -9;
const int ValueAlignment = 7;

double a = 3;
double b = 4;
Console.WriteLine($"Three classical Pythagorean means of {a} and {b}:");
Console.WriteLine($"|{"Arithmetic",NameAlignment}|{0.5 * (a + b),ValueAlignment:F3}|");
Console.WriteLine($"|{"Geometric",NameAlignment}|{Math.Sqrt(a * b),ValueAlignment:F3}|");
Console.WriteLine($"|{"Harmonic",NameAlignment}|{2 / (1 / a + 1 / b),ValueAlignment:F3}|");

// Expected output:
// Three classical Pythagorean means of 3 and 4:
// |Arithmetic|  3.500|
// |Geometric|  3.464|
// |Harmonic |  3.429|

出力例が示すように、書式設定された式の結果の長さが指定したフィールドの幅を超える場合、alignment の値は無視されます。As the example output shows, if the length of the formatted expression result exceeds specified field width, the alignment value is ignored.

詳細については、「複合書式設定」トピックの「Alignment コンポーネント」のセクションを参照してください。For more information, see the Alignment Component section of the Composite Formatting topic.

挿入文字列でエスケープ シーケンスを使用する方法How to use escape sequences in an interpolated string

挿入文字列は、通常の文字列リテラルで使用できるすべてのエスケープ シーケンスをサポートします。Interpolated strings support all escape sequences that can be used in ordinary string literals. 詳細については、「文字列のエスケープ シーケンス」を参照してください。For more information, see String escape sequences.

エスケープ シーケンスをリテラルで解釈するには、verbatim 文字列リテラルを使用します。To interpret escape sequences literally, use a verbatim string literal. verbatim 補間文字列は、$ 文字で始まり、@ 文字が続きます。An interpolated verbatim string starts with the $ character followed by the @ character. C# 8.0 以降では、$@ のトークンを任意の順序で使用できます。$@"..."@$"..." はどちらも有効な verbatim 補間文字列です。Starting with C# 8.0, you can use the $ and @ tokens in any order: both $@"..." and @$"..." are valid interpolated verbatim strings.

中かっこ "{" または "}" を結果文字列に含める場合は、2 つの中かっこ "{{" または "}}" を使用します。To include a brace, "{" or "}", in a result string, use two braces, "{{" or "}}". 詳細については、「複合書式設定」トピックの「エスケープ中かっこ ({})」のセクションを参照してください。For more information, see the Escaping Braces section of the Composite Formatting topic.

次の例は、結果文字列に中かっこを含め、verbatim 挿入文字列を作成する方法を示しています。The following example shows how to include braces in a result string and construct a verbatim interpolated string:

var xs = new int[] { 1, 2, 7, 9 };
var ys = new int[] { 7, 9, 12 };
Console.WriteLine($"Find the intersection of the {{{string.Join(", ",xs)}}} and {{{string.Join(", ",ys)}}} sets.");

var userName = "Jane";
var stringWithEscapes = $"C:\\Users\\{userName}\\Documents";
var verbatimInterpolated = $@"C:\Users\{userName}\Documents";
Console.WriteLine(stringWithEscapes);
Console.WriteLine(verbatimInterpolated);

// Expected output:
// Find the intersection of the {1, 2, 7, 9} and {7, 9, 12} sets.
// C:\Users\Jane\Documents
// C:\Users\Jane\Documents

補間式で三項条件演算子 ?: を使用する方法How to use a ternary conditional operator ?: in an interpolation expression

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

var rand = new Random();
for (int i = 0; i < 7; i++)
{
    Console.WriteLine($"Coin flip: {(rand.NextDouble() < 0.5 ? "heads" : "tails")}");
}

文字列補間を使用してカルチャ固有の結果文字列を作成する方法How to create a culture-specific result string with string interpolation

既定では、挿入文字列は、すべての書式設定操作に対して CultureInfo.CurrentCulture プロパティで定義された現在のカルチャを使用します。By default, an interpolated string uses the current culture defined by the CultureInfo.CurrentCulture property for all formatting operations. カルチャ固有の結果文字列を作成するには、System.FormattableString インスタンスへの挿入文字列の暗黙的変換を使用し、その ToString(IFormatProvider) メソッドを呼び出します。Use implicit conversion of an interpolated string to a System.FormattableString instance and call its ToString(IFormatProvider) method to create a culture-specific result string. その方法を次の例に示します。The following example shows how to do that:

var cultures = new System.Globalization.CultureInfo[]
{
    System.Globalization.CultureInfo.GetCultureInfo("en-US"),
    System.Globalization.CultureInfo.GetCultureInfo("en-GB"),
    System.Globalization.CultureInfo.GetCultureInfo("nl-NL"),
    System.Globalization.CultureInfo.InvariantCulture
};

var date = DateTime.Now;
var number = 31_415_926.536;
FormattableString message = $"{date,20}{number,20:N3}";
foreach (var culture in cultures)
{
    var cultureSpecificMessage = message.ToString(culture);
    Console.WriteLine($"{culture.Name,-10}{cultureSpecificMessage}");
}

// Expected output is like:
// en-US       5/17/18 3:44:55 PM      31,415,926.536
// en-GB      17/05/2018 15:44:55      31,415,926.536
// nl-NL        17-05-18 15:44:55      31.415.926,536
//            05/17/2018 15:44:55      31,415,926.536

例に示すように、FormattableString インスタンスを 1 回使用して、さまざまなカルチャに対する複数の結果文字列を生成することができます。As the example shows, you can use one FormattableString instance to generate multiple result strings for various cultures.

インバリアント カルチャを使用して結果文字列を作成する方法How to create a result string using the invariant culture

FormattableString.ToString(IFormatProvider) メソッドと共に静的な FormattableString.Invariant メソッドを使用して、InvariantCulture の結果文字列に挿入文字列を解決することができます。Along with the FormattableString.ToString(IFormatProvider) method, you can use the static FormattableString.Invariant method to resolve an interpolated string to a result string for the InvariantCulture. その方法を次の例に示します。The following example shows how to do that:

string messageInInvariantCulture = FormattableString.Invariant($"Date and time in invariant culture: {DateTime.Now}");
Console.WriteLine(messageInInvariantCulture);

// Expected output is like:
// Date and time in invariant culture: 05/17/2018 15:46:24

まとめConclusion

このチュートリアルでは、文字列補間の使用に関する一般的なシナリオについて説明しています。This tutorial describes common scenarios of string interpolation usage. 文字列補間の詳細については、文字列補間に関するトピックを参照してください。For more information about string interpolation, see the String interpolation topic. .NET の型の書式設定の詳細については、「.NET での型の書式設定」および「複合書式設定」のトピックを参照してください。For more information about formatting types in .NET, see the Formatting Types in .NET and Composite formatting topics.

参照See also