補間文字列 (Visual Basic リファレンス)

文字列の作成に使用されます。 挿入文字列は、挿入式が含まれているテンプレート文字列のように見えます。 挿入文字列は、含まれる挿入式をその文字列表現に置き換えた文字列を返します。 この機能は、Visual Basic 14 以降のバージョンで使用できます。

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

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 つの中かっこ "{{" または "}}" を使用します。 詳細については、「暗黙の型変換」を参照してください。

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

Public Module Example
   Public Sub Main()
      Dim name = "Horace"
      Dim age = 34
      Dim s1 = $"He asked, ""Is your name {name}?"", but didn't wait for a reply."
      Console.WriteLine(s1)
      
      Dim s2 = $"{name} is {age:D3} year{If(age = 1, "", "s")} old."
      Console.WriteLine(s2) 
   End Sub
End Module
' 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 への変換。 次の例では、挿入文字列式を文字列表現で置き換えた文字列が返されます。 次に例を示します。

    Public Module Example
       Public Sub Main()
          Dim name = "Bartholomew"
          Dim s1 = $"Hello, {name}!"  
          Console.WriteLine(s1)
       End Sub
    End Module
    ' The example displays the following output:
    '      Hello, Bartholomew!
    ' </Snippet1>
    

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

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

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

    Imports System.Globalization
    Imports System.Reflection
    
    Public Module Example
       Public Sub Main()
          Dim price = 1000
          Dim s2 As IFormattable = $"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)      
       End Sub
    
       Private Sub ShowInfo(obj As Object)
          Console.WriteLine($"Displaying member information:{vbCrLf}")
          Dim t = obj.GetType()
          Dim flags = BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.Static Or BindingFlags.NonPublic
          For Each m In t.GetMembers(flags) 
             Console.Write($"   {m.Name} {m.MemberType}")   
             If m.MemberType = MemberTypes.Property Then
                Dim p = t.GetProperty(m.Name, flags)
                Console.Write($"   Value: {p.GetValue(obj)}")         
             End If
             If m.MemberType = MemberTypes.Field Then
                Dim f = t.GetField(m.Name, flags)
                Console.Write($"   Value: {f.GetValue(obj)}")
             End If
             Console.WriteLine()
          Next
          Console.WriteLine($"-------{vbCrLf}")
       End Sub
    End Module
    ' 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 €.
    ' </Snippet1>
    
    

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

  3. 補間文字列から複合書式指定文字列を表す FormattableString 変数への変換。 たとえば、複合書式指定文字列を検査し、それが結果文字列としてどのように表示されるかを検査すると、クエリを構築する場合にインジェクション攻撃を防ぐことができます。 FormattableString には次のものも含まれます。

    二重中かっこ ("{{" および "}}") のすべての出現箇所は、書式指定するまで二重中かっこのままです。 含まれるすべての補間式は、{0}、{1} などに変換されます。

    Imports System.Globalization
    
    Public Module Example
       Public Sub Main()
          Dim name = "Bartholomew"
          Dim s3 As FormattableString = $"Hello, {name}!"  
          Console.WriteLine($"String: '{s3.Format}'")
          Console.WriteLine($"Arguments: {s3.ArgumentCount}")
          Console.WriteLine($"Result string: {s3}")
       End Sub
    End Module
    ' The example displays the following output:
    '       String: 'Hello, {0}!'
    '       Arguments: 1
    '       Result string: Hello, Bartholomew!
    
    

関連項目