$-字串插補 (c # 參考)

$ 特殊字元會將字串常值識別為「字串內插補點」。 插入字串是可能包含「內插補點運算式」的字串常值。 將插入字串解析為結果字串時,會將具有內插補點運算式之項目取代為運算式結果的字串表示。 從 c # 6 開始,可以使用這項功能。

字串插補在建立格式化字串時,是比字串複合格式化功能更容易理解且方便的語法。 下列範例會使用這兩項功能,產生相同的輸出:

string name = "Mark";
var date = DateTime.Now;

// Composite formatting:
Console.WriteLine("Hello, {0}! Today is {1}, it's {2:HH:mm} now.", name, date.DayOfWeek, date);
// String interpolation:
Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now.");
// Both calls produce the same output that is similar to:
// Hello, Mark! Today is Wednesday, it's 19:40 now.

插入字串的結構

若要將字串常值識別為插入字串,請在其前面加上 $ 符號。 字串常值開頭的 $" 之間不能有空白字元。

具有內插補點運算式的項目結構如下所示:

{<interpolationExpression>[,<alignment>][:<formatString>]}

在方括號中的元素是選擇性的元素。 下表說明每個元素:

元素 描述
interpolationExpression 產生要格式化之結果的運算式。 的字串表示 nullString.Empty
alignment 常數運算式,其值會定義運算式結果之字串表示中的最小字元數。 如果是正數,則字串表示是靠右對齊;如果是負數,它是靠左對齊。 如需詳細資訊,請參閱對齊元件
formatString 運算式結果的類型所支援的格式字串。 如需詳細資訊,請參閱格式字串元件

下列範例會使用上述的選擇性格式化元件:

Console.WriteLine($"|{"Left",-7}|{"Right",7}|");

const int FieldWidthRightAligned = 20;
Console.WriteLine($"{Math.PI,FieldWidthRightAligned} - default formatting of the pi number");
Console.WriteLine($"{Math.PI,FieldWidthRightAligned:F3} - display only three decimal digits of the pi number");
// Expected output is:
// |Left   |  Right|
//     3.14159265358979 - default formatting of the pi number
//                3.142 - display only three decimal digits of the pi number

從 c # 10 開始,當預留位置使用的所有運算式也都是常數位符串時,您可以使用字串插補來初始化常數位串。 換句話說,每個 interpolationexpression 都必須是字串,而且必須是編譯時間常數。

特殊字元

若要在插入字串所產生的文字中包含大括弧 "{" 或 "}",請使用雙大括弧 "{{" 或 "}}"。 如需詳細資訊,請參閱逸出大括號

因為冒號 (":") 在內插補點運算式項目中具有特殊意義,為了在內插補點運算式中使用條件運算子,請用括弧括住運算式。

下列範例示範如何在結果字串中包含大括弧以及如何在內插補點運算式中使用條件運算子:

string name = "Horace";
int age = 34;
Console.WriteLine($"He asked, \"Is your name {name}?\", but didn't wait for a reply :-{{");
Console.WriteLine($"{name} is {age} year{(age == 1 ? "" : "s")} old.");
// Expected output is:
// He asked, "Is your name Horace?", but didn't wait for a reply :-{
// Horace is 34 years old.

插入的逐字字串開頭為字元 $ 後面接著字元 @ 。 如需逐字字串的詳細資訊,請參閱字串逐字識別碼主題。

注意

從 c # 8.0 開始,您可以依 $ @ 任何順序使用和權杖: $@"..."@$"..." 都是有效的內插逐字字串。 在舊版的 c # 中, $ 權杖必須出現在 @ 標記之前。

隱含轉換和如何指定 IFormatProvider 實作為

有三個來自插入字串的隱含轉換:

  1. 將插入字串轉換成插入字串解析結果的 String 執行個體,且內插補點運算式項目取代為其結果的格式正確字串表示。 這種轉換會使用 CurrentCulture 來格式化運算式結果。

  2. 將插入字串轉換成 FormattableString 執行個體,以代表複合格式字串,並將運算式結果格式化。 那可讓您從單一 FormattableString 執行個體建立多個具有特定文化特性內容的結果字串。 若要這樣做,請呼叫下列其中一種方法:

    您也可以使用 ToString(IFormatProvider) 方法,提供 IFormatProvider 支援自訂格式之介面的使用者定義執行。 如需詳細資訊,請參閱.net 中格式化類型的 >icustomformatter 一節中的自訂格式一節。

  3. 將插入字串轉換成 IFormattable 執行個體,也可讓您從單一 IFormattable 執行個體建立多個具有特定文化特性內容的結果字串。

下列範例會使用隱含轉換成 FormattableString,來建立文化特性特定結果字串:

double speedOfLight = 299792.458;
FormattableString message = $"The speed of light is {speedOfLight:N3} km/s.";

System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("nl-NL");
string messageInCurrentCulture = message.ToString();

var specificCulture = System.Globalization.CultureInfo.GetCultureInfo("en-IN");
string messageInSpecificCulture = message.ToString(specificCulture);

string messageInInvariantCulture = FormattableString.Invariant(message);

Console.WriteLine($"{System.Globalization.CultureInfo.CurrentCulture,-10} {messageInCurrentCulture}");
Console.WriteLine($"{specificCulture,-10} {messageInSpecificCulture}");
Console.WriteLine($"{"Invariant",-10} {messageInInvariantCulture}");
// Expected output is:
// nl-NL      The speed of light is 299.792,458 km/s.
// en-IN      The speed of light is 2,99,792.458 km/s.
// Invariant  The speed of light is 299,792.458 km/s.

其他資源

如果您是字串插補的新手,請參閱 C# 中的字串插補互動式教學課程。 您也可以在 c # 教學課程中檢查另一個 字串內插補 點,以示範如何使用插入字串來產生格式化字串。

內插字串的編譯

如果內插字串的類型為 string,它通常會轉換成 String.Format 方法呼叫。 如果分析的行為相當於串連,編譯器可以將 String.Format 取代為 String.Concat

如果內插字串的類型為 IFormattableFormattableString,編譯器會產生 FormattableStringFactory.Create 方法的呼叫。

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格內插字串一節。

另請參閱