字串插值 (Visual Basic 參考)Interpolated Strings (Visual Basic 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. 這項功能可在 Visual Basic 14 和更新版本。This feature is available in Visual Basic 14 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}' 和 '{hours:hh}'。contains two interpolated expressions, '{name}' and '{hours: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 white space between the $ and the " that starts the string. 這樣做會導致編譯器錯誤。Doing so causes a compiler 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.

若要在字串插值中包含大括弧 ("{" 或 "}"),請使用雙大括弧 "{{" 或 "}}"。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.

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.
' </Snippet1>

隱含轉換Implicit Conversions

有三個來自字串插值的隱含型別轉換:There are three implicit type conversions from an interpolated string:

  1. 將字串插值轉換成 StringConversion 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:

    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>
    

    這是字串解譯的最終結果。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.

    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>
    
    

    請注意,只能使用反映來檢查字串插值。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 a 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. AFormattableString還包括:A FormattableString also includes:

    所有出現的雙大括弧 ("{{"和"}}") 保持為雙大括弧,直到您格式化為止。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.

    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!
    
    

另請參閱See also