挿入文字列 (C# リファレンス)Interpolated Strings (C# Reference)

文字列の作成に使用されます。Used to construct strings. 挿入文字列は、挿入式が含まれているテンプレート文字列のように見えます。An interpolated string looks like a template string that contains interpolated expressions. 挿入文字列は、含まれる挿入式をその文字列表現に置き換えた文字列を返します。An interpolated string returns a string that replaces the interpolated expressions that it contains with their string representations. この機能は、C# 6 およびそれ以降のバージョンで使用できます。This feature is available in C# 6 and later versions.

挿入文字列の引数は、複合書式指定文字列よりもわかりやすいものです。The arguments of an interpolated string are easier to understand than a composite format string. たとえば、挿入文字列には、For example, the interpolated string

Console.WriteLine($"Name = {name}, hours = {hours:hh}");

'{name}' の 2 つの補間式を含む、' {時間: hh}'。contains two interpolated expressions, '{name}' and '{hour:hh}'. 同等の複合書式指定文字列は次のとおりです。The equivalent composite format string is:

Console.WriteLine("Name = {0}, hours = {1:hh}", name, hours); 

挿入文字列の構造は次のとおりです。The structure of an interpolated string is:

$"<text> {<interpolated-expression> [,<field-width>] [:<format-string>] } <text> ..."  

ここで、where:

  • field-width はフィールドの文字数を示す符号付き整数です。field-width is a signed integer that indicates the number of characters in the field. これが正である場合、フィールドは右揃えとなり、負である場合は左揃えとなります。If it is positive, the field is right-aligned; if negative, left-aligned.

  • format-string は、書式設定されるオブジェクトの種類に適した書式指定文字列です。format-string is a format string appropriate for the type of object being formatted. たとえば、DateTime の値の場合、"D" または "d" などの、標準の日付と時刻の書式指定文字列になる可能性があります。For example, for a DateTime value, it could be a standard date and time format string such as "D" or "d".

重要

間の空白を持つことはできません、$"文字列を開始します。You cannot have any whitespace between the $ and the " that starts the string. これにより、コンパイル時エラーが発生します。Doing so causes a compile time error.

文字列リテラルを使用できる場所であればどこでも補間文字列を使用できます。You can use an interpolated string anywhere you can use a string literal. この挿入文字列は、挿入文字列を含むコードが実行されるたびに評価されます。The interpolated string is evaluated each time the code with the interpolated string executes. これにより、挿入文字列の定義と評価を分離することができます。This allows you to separate the definition and evaluation of an interpolated string.

挿入文字列に中かっこ "{" または "}" を含めるには、2 つの中かっこ "{{" または "}}" を使用します。To include a curly brace ("{" or "}") in an interpolated string, use two curly braces, "{{" or "}}". 詳細については、「暗黙の型変換」を参照してください。See the Implicit Conversions section for more details.

挿入文字列には、引用符 (")、コロン (:)、コンマ (,) など、特別な意味を持つその他の文字が含まれることがあります。これらの文字がリテラル テキストに出現する場合は、エスケープする必要があります。また、これらの文字が言語要素として挿入式に含まれる場合は、かっこで区切られた式に含める必要があります。If the interpolated string contains other characters with special meaning in an interpolated string, such as the quotation mark ("), colon (:), or comma (,), they should be escaped if they occur in literal text, or they should be included in an expression delimited by parentheses if they are language elements included in an interpolated expression. 次の例では、引用符をエスケープして、結果文字列に引用符を含めています。さらに、かっこを使用して式 (age == 1 ? "" : "s") を区切り、コロンが書式指定文字列の先頭として解釈されないようにしています。The following example escapes quotation marks to include them in the result string, and it uses parentheses to delimit the expression (age == 1 ? "" : "s") so that the colon is not interpreted as beginning a format string.

using System;

public class Example
{
   public static void Main()
   {
      var name = "Horace";
      var age = 34;
      var s1 = $"He asked, \"Is your name {name}?\", but didn't wait for a reply.";
      Console.WriteLine(s1);
      
      var s2 = $"{name} is {age:D3} year{(age == 1 ? "" : "s")} old.";
      Console.WriteLine(s2); 
   }
}
// The example displays the following output:
//       He asked, "Is your name Horace?", but didn't wait for a reply.
//       Horace is 034 years old.

使用される文字列は逐語的補間、$文字が続く、@文字です。Verbatim interpolated strings use the $ character followed by the @ character. 逐語的文字列の詳細については、次を参照してください。、文字列トピックです。For more information about verbatim strings, see the string topic. 次のコードでは、逐語的補間文字列を使用して、前のスニペットの変更済みバージョンを示します。The following code is a modified version of the previous snippet using a verbatim interpolated string:

using System;

public class Example
{
    public static void Main()
    {
        var name = "Horace";
        var age = 34;
        var s1 = $@"He asked, ""Is your name {name}?"", but didn't wait for a reply.
 {name} is {age:D3} year{(age == 1 ? "" : "s")} old.";
       Console.WriteLine(s1);
    }
}
// The example displays the following output:
//       He asked, "Is your name Horace?", but didn't wait for a reply.
//       Horace is 034 years old.

逐語的文字列に従っていないために、書式設定の変更が必要な\エスケープ シーケンスです。The formatting changes are necessary because verbatim strings do not obey \ escape sequences.

重要

$トークンは、前に指定する必要があります、@逐語的補間文字列でトークンです。The $ token must appear before the @ token in a verbatim interpolated string.

暗黙の型変換Implicit Conversions

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

  1. 挿入文字列から String への変換。Conversion of an interpolated string to a String. 次の例では、挿入文字列式を文字列表現で置き換えた文字列が返されます。The following example returns a string whose interpolated string expressions have been replaced with their string representations. 例:For example:

    using System;
    
    public class Example
    {
       public static void Main()
       {
          var name = "Bartholomew";
          var s1 = $"Hello, {name}!";  
          Console.WriteLine(s1);
       }
    }
    // The example displays the following output:
    //      Hello, Bartholomew!
    

    これが、文字列解釈の最終的な結果です。This is the final result of a string interpretation. 二重中かっこ ("{{" および "}}") のすべての発生箇所は、単一の中かっこに変換されます。All occurrences of double curly braces ("{{" and "}}") are converted to a single curly brace.

  2. 挿入文字列から IFormattable 変数への変換。これは、単一の IFormattable インスタンスから、カルチャ固有のコンテンツを持った複数の結果文字列の作成を可能にするものです。Conversion of an interpolated string to an IFormattable variable that allows you create multiple result strings with culture-specific content from a single IFormattable instance. これは、個々のカルチャに適切な数値書式や日付形式などの情報を含めるのに便利です。This is useful for including such things as the correct numeric and date formats for individual cultures. 二重中かっこ ("{{" および "}}") のすべての出現箇所は、明示的または暗黙的に ToString() メソッドを呼び出して文字列を書式指定するまで、二重中かっこのままです。All occurrences of double curly braces ("{{" and "}}") remain as double curly braces until you format the string by explicitly or implicitly calling the ToString() method. 含まれるすべての補間式は、{0}、{1} などに変換されます。All contained interpolation expressions are converted to {0}, {1}, and so on.

    次の例では、リフレクションを使用することで、挿入文字列から作成された IFormattable 変数のフィールドおよびプロパティ値だけでなく、メンバーも表示しています。The following example uses reflection to display the members as well as the field and property values of an IFormattable variable that is created from an interpolated string. 渡しても、IFormattable変数をConsole.WriteLine(String)メソッドです。It also passes the IFormattable variable to the Console.WriteLine(String) method.

    using System;
    using System.Globalization;
    using System.Reflection;
    
    public class Example
    {
       public static void Main()
       {
          var price = 1000;
          IFormattable s2 = $"The cost of this item is {price:C}.";  
          ShowInfo(s2);
          CultureInfo.CurrentCulture = new CultureInfo("en-US");
          Console.WriteLine(s2);
          CultureInfo.CurrentCulture = new CultureInfo("fr-FR");
          Console.WriteLine(s2);      
       }
    
       private static void ShowInfo(object obj)
       {
          Console.WriteLine("Displaying member information:\n");
          var t = obj.GetType();
          var flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic;
          foreach (var m in t.GetMembers(flags)) {
             Console.WriteLine($"{m.Name}: {m.MemberType}");   
             if (m.MemberType == MemberTypes.Property) {
                var p = t.GetProperty(m.Name, flags);
                Console.WriteLine($"   Value: {p.GetValue(obj)}");         
             }
             if (m.MemberType == MemberTypes.Field) {
                var f = t.GetField(m.Name, flags);
                Console.WriteLine($"   Value: {f.GetValue(obj)}");
             }
          }
          Console.WriteLine("-------\n");
       }
    }
    // The example displays the following output:
    //       Displaying member information:
    //       
    //       get_Format: Method
    //       GetArguments: Method
    //       get_ArgumentCount: Method
    //       GetArgument: Method
    //       ToString: Method
    //       System.IFormattable.ToString: Method
    //       ToString: Method
    //       Equals: Method
    //       GetHashCode: Method
    //       GetType: Method
    //       Finalize: Method
    //       MemberwiseClone: Method
    //       .ctor: Constructor
    //       Format: Property
    //          Value: The cost of this item is {0:C}.
    //       ArgumentCount: Property
    //          Value: 1
    //       _format: Field
    //          Value: The cost of this item is {0:C}.
    //       _arguments: Field
    //          Value: System.Object[]
    //       -------
    //       
    //       The cost of this item is $1,000.00.
    //       The cost of this item is 1 000,00 €.
    

    挿入文字列の検査には、リフレクションを使用する必要があることに注意してください。Note that the interpolated string can be inspected only by using reflection. かどうか、メソッドなどの書式設定文字列に渡されますWriteLine(String)の書式指定項目は解決され、結果の文字列が返されます。If it is passed to a string formatting method, such as WriteLine(String), its format items are resolved and the result string returned.

  3. 挿入文字列から複合書式指定文字列を表す FormattableString 変数への変換。Conversion of an interpolated string to an FormattableString variable that represents a composite format string. たとえば、複合書式指定文字列を検査し、それが結果文字列としてどのように表示されるかを検査すると、クエリを構築する場合にインジェクション攻撃を防ぐことができます。Inspecting the composite format string and how it renders as a result string might, for example, help you protect against an injection attack if you were building a query. FormattableString には、InvariantCultureCurrentCulture の結果文字列を生成できる ToString() オーバーロードも含まれています。FormattableString also includes ToString() overloads that let you produce result strings for the InvariantCulture and CurrentCulture. 二重中かっこ ("{{" および "}}") のすべての出現箇所は、書式指定するまで二重中かっこのままです。All occurrences of double curly braces ("{{" and "}}") remain as double curly braces, until you format. 含まれるすべての補間式は、{0}、{1} などに変換されます。All contained interpolation expressions are converted to {0}, {1}, and so on.

    using System;
    using System.Globalization;
    
    public class Example
    {
       public static void Main()
       {
          var name = "Bartholomew";
          FormattableString s3 = $"Hello, {name}!";  
          Console.WriteLine($"String: {s3.Format}");
          Console.WriteLine($"Arguments: {s3.ArgumentCount}");
          Console.WriteLine($"Result string: {s3}");
       }
    }
    // The example displays the following output:
    //       String: Hello, {0}!
    //       Arguments: 1
    //       Result string: Hello, Bartholomew!
    

言語仕様Language Specification

詳細については、「C# 言語の仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

関連項目See Also

System.IFormattable
System.FormattableString
C# リファレンスC# Reference
C# プログラミング ガイドC# Programming Guide