Ciągi interpolowane (odwołanie do Języka Visual Basic)
Służy do konstruowania ciągów. Ciąg interpolowany wygląda jak ciąg szablonu zawierający wyrażenia interpolowane. Ciąg interpolowany zwraca ciąg, który zastępuje wyrażenia interpolowane, które zawiera ich reprezentacje ciągów. Ta funkcja jest dostępna w visual basic 14 i nowszych wersjach.
Argumenty ciągu interpolowanego są łatwiejsze do zrozumienia niż ciąg formatu złożonego. Na przykład ciąg interpolowany
Console.WriteLine($"Name = {name}, hours = {hours:hh}")
Zawiera dwa wyrażenia interpolowane, "{name}" i "{hours:hh}". Równoważny ciąg formatu złożonego to:
Console.WriteLine("Name = {0}, hours = {1:hh}", name, hours)
Struktura ciągu interpolowanego to:
$"<text> {<interpolated-expression> [,<field-width>] [:<format-string>] } <text> ..."
gdzie:
field-width to liczba całkowita ze znakiem wskazująca liczbę znaków w polu. Jeśli pole jest dodatnie, jest wyrównane do prawej; jeśli ujemne, wyrównane do lewej.
format-string to ciąg formatu odpowiedni dla typu sformatowanego obiektu. Na przykład dla DateTime wartości może to być standardowy ciąg formatu daty i godziny, taki jak "D" lub "d".
Ważne
Nie można mieć żadnego odstępu między znakiem $
i "
, który uruchamia ciąg. Spowoduje to błąd kompilatora.
Możesz użyć ciągu interpolowanego w dowolnym miejscu, w którym można użyć literału ciągu. Ciąg interpolowany jest obliczany za każdym razem, gdy kod z ciągiem interpolowanym jest wykonywany. Dzięki temu można oddzielić definicję i ocenę ciągu interpolowanego.
Aby uwzględnić nawias klamrowy ("{" lub "}") w ciągu interpolowanym, użyj dwóch nawiasów klamrowych, "{{" lub "}}". Aby uzyskać więcej informacji, zobacz sekcję Niejawne konwersje.
Jeśli ciąg interpolowany zawiera inne znaki ze specjalnym znaczeniem w ciągu interpolowanym, takim jak cudzysłów ("), dwukropek (:) lub przecinek (,), powinny one zostać pominięte, jeśli wystąpią w tekście literału lub powinny zostać uwzględnione w wyrażeniu rozdzielonym nawiasami, jeśli są elementami języka zawartymi w wyrażeniu interpolowanym. Poniższy przykład umożliwia ucieczkę cudzysłowów w celu uwzględnienia ich w ciągu wynikowym:
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.
Konwersje niejawne
Istnieją trzy niejawne konwersje typów z ciągu interpolowanego:
Konwersja ciągu interpolowanego na String. Poniższy przykład zwraca ciąg, którego wyrażenia ciągów interpolowanych zostały zastąpione ich reprezentacjami ciągów. Na przykład:
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>
Jest to końcowy wynik interpretacji ciągu. Wszystkie wystąpienia podwójnych nawiasów klamrowych ("{{" i "}}") są konwertowane na pojedynczy nawias klamrowy.
Konwersja ciągu interpolowanego na zmienną IFormattable , która umożliwia tworzenie wielu ciągów wyników z zawartością specyficzną dla kultury z jednego IFormattable wystąpienia. Jest to przydatne w przypadku dołączania takich elementów jak poprawne formaty liczbowe i daty dla poszczególnych kultur. Wszystkie wystąpienia podwójnych nawiasów klamrowych ("{{" i "}}") pozostają jako podwójne nawiasy klamrowe, dopóki ciąg nie zostanie sformatowany jawnie lub niejawnie wywołując metodę ToString() . Wszystkie zawarte wyrażenia interpolacji są konwertowane na {0}, {1}i tak dalej.
W poniższym przykładzie użyto odbicia, aby wyświetlić elementy członkowskie, a także wartości pól i właściwości zmiennej IFormattable utworzonej na podstawie ciągu interpolowanego. Przekazuje również zmienną IFormattableConsole.WriteLine(String) do metody .
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>
Należy pamiętać, że ciąg interpolowany można sprawdzić tylko przy użyciu odbicia. Jeśli jest przekazywany do metody formatowania ciągów, takiej jak WriteLine(String), jego elementy formatu są rozpoznawane i zwracany ciąg wynikowy.
Konwersja ciągu interpolowanego na zmienną FormattableString reprezentującą ciąg formatu złożonego. Inspekcja ciągu formatu złożonego i sposobu renderowania go jako ciągu wynikowego może na przykład pomóc w ochronie przed atakiem polegającym na wstrzyknięciu, jeśli tworzysz zapytanie. Obejmuje FormattableString również:
ToString() Przeciążenie, które generuje ciąg wynikowy dla elementu CurrentCulture.
Metoda Invariant , która tworzy ciąg dla elementu InvariantCulture.
ToString(IFormatProvider) Metoda, która generuje ciąg wynikowy dla określonej kultury.
Wszystkie wystąpienia podwójnych nawiasów klamrowych ("{{" i "}}") pozostają jako podwójne nawiasy klamrowe do momentu sformatowania. Wszystkie zawarte wyrażenia interpolacji są konwertowane na {0}, {1}i tak dalej.
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!