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

文字列の作成に使用されます。 挿入文字列は、挿入式が含まれているテンプレート文字列のように見えます。 挿入文字列は、含まれる挿入式をその文字列表現に置き換えた文字列を返します。

挿入文字列の引数は、複合書式指定文字列よりもわかりやすいものです。 たとえば、挿入文字列には、

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

2 つの挿入式、"{name}" と "{hours:hh}" が含まれています。 同等の複合書式指定文字列は次のとおりです。

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

挿入文字列の構造は次のとおりです。

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

ここで、

  • field-width はフィールドの文字数を示す符号付き整数です。 これが正である場合、フィールドは右揃えとなり、負である場合は左揃えとなります。

  • format-string は、書式設定されるオブジェクトの種類に適した書式指定文字列です。 たとえば、DateTime の値の場合、"D" または "d" などの、標準の日付と時刻の書式指定文字列になる可能性があります。

文字列リテラルを使用できる場所であればどこでも補間文字列を使用できます。 この挿入文字列は、挿入文字列を含むコードが実行されるたびに評価されます。 これにより、挿入文字列の定義と評価を分離することができます。

挿入文字列に中かっこ "{" または "}" を含めるには、2 つの中かっこ "{{" または "}}" を使用します。 詳細については、「暗黙の型変換」を参照してください。

挿入文字列には、引用符 (")、コロン (:)、コンマ (,) など、特別な意味を持つその他の文字が含まれることがあります。これらの文字がリテラル テキストに出現する場合は、エスケープする必要があります。また、これらの文字が言語要素として挿入式に含まれる場合は、かっこで区切られた式に含める必要があります。 次の例では、引用符をエスケープして、結果文字列に引用符を含めています。さらに、かっこを使用して式 (age == 1 ? "" : "s") を区切り、コロンが書式指定文字列の先頭として解釈されないようにしています。

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.

暗黙の型変換

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

  1. 挿入文字列から String への変換。 次の例では、挿入文字列式を文字列表現で置き換えた文字列が返されます。 例:

    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!
    

    これが、文字列解釈の最終的な結果です。 二重中かっこ ("{{" および "}}") のすべての発生箇所は、単一の中かっこに変換されます。

  2. 挿入文字列から IFormattable 変数への変換。これは、単一の IFormattable インスタンスから、カルチャ固有のコンテンツを持った複数の結果文字列の作成を可能にするものです。 これは、個々のカルチャに適切な数値書式や日付形式などの情報を含めるのに便利です。 二重中かっこ ("{{" および "}}") のすべての出現箇所は、明示的または暗黙的に ToString() メソッドを呼び出して文字列を書式指定するまで、二重中かっこのままです。 含まれるすべての補間式は、{0}、{1} などに変換されます。

    次の例では、リフレクションを使用することで、挿入文字列から作成された IFormattable 変数のフィールドおよびプロパティ値だけでなく、メンバーも表示しています。 さらに、IFormattable 変数を @System.Console(System.String) メソッドに渡しています。

    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 €.
    

    挿入文字列の検査には、リフレクションを使用する必要があることに注意してください。 挿入文字列が WriteLine(String) などの文字列書式指定メソッドに渡されると、書式指定項目が解決され、結果文字列が返されます。

  3. 挿入文字列から複合書式指定文字列を表す FormattableString 変数への変換。 たとえば、複合書式指定文字列を検査し、それが結果文字列としてどのように表示されるかを検査すると、クエリを構築する場合にインジェクション攻撃を防ぐことができます。 FormattableString には、@System.Globalization.InvariantCulture と @System.Globalization.CurrentCulture の結果文字列を生成できる ToString() オーバーロードも含まれています。 二重中かっこ ("{{" および "}}") のすべての出現箇所は、書式指定するまで二重中かっこのままです。 含まれるすべての補間式は、{0}、{1} などに変換されます。

    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!
    

言語仕様

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

関連項目

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