$ 特殊字元會將字串常值識別為「字串內插補點」。

插入字串是可能包含「插入運算式」的字串常值。將插入字串解析為結果字串時,會將具有插入運算式的項目取代為運算式結果的字串表示。

若要將字串常值識別為插入字串,請在其前面加上 $ 符號。 字串常值開頭的 $" 之間不能有空白字元,這樣做會導致編譯時期錯誤。

描述的有點複雜,但實際上卻很容易上手,如下

1
2
3
4
5
 var date = DateTime.Now;
Console.WriteLine(string.Format("Today is {0}, it's {1:HH:mm} now.", date.DayOfWeek, date));
// Today is Wednesday, it's 19:40 now.
Console.WriteLine($"Today is {date.DayOfWeek}, it's {date:HH:mm} now.");
// Today is Wednesday, it's 19:40 now.

以上兩句結果是一樣的,因為 $ 是一個語法糖(syntactic sugar),會透過編譯器轉換成帶有參數的 string.Format() 方法。

用法

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

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

若要在插入字串所產生的文字中包含大括號 {},請使用兩個大括號 { {} } 來逸出大括號。

interpolatedExpression:產生要格式化之結果的運算式。 null 結果的字串表示是 String.Empty

alignment:常數的運算式,其值定義插值運算式結果的字串表示的字元數下限。 如果是正數,則字串表示是靠右對齊;如果是負數,它是靠左對齊。

formatString:運算式結果的類型所支援的格式字串。

如下

1
2
3
4
5
6
7
Console.WriteLine($"|{"Left",-7}|{"Right",7}|");
// |Left | Right|
// 字串內容會像PadRight與PadLeft一樣將字串補齊至指定數量。
Console.WriteLine($"|{123:C}|");
// |$123.00|
Console.WriteLine($"|{123,10:C}|");
// | $123.00|

也可以在插入運算式中使用任何語法正確的表達式。如下

1
2
3
int a = 2;
Console.WriteLine($"a = {a + a}");
// a = 4

而三元運算子 (?:) 則需要括號括住。如下

1
2
3
int a = 2;
Console.WriteLine($"a = {(a == 3 ? "2" : "3")}");
// a = 3

總結

雖然 $string.Format() 結果一樣,但是在撰寫時的可讀性卻有很大的差異,當引數一多就能想像差別了,string.Format() 需要到引數裡找變數名稱,而 $ 則是在字串裡面查找。如下

1
2
3
4
5
6
7
8
9
10
11
12
string str1 = "1";
string str2 = "2";
string str3 = "3";
string str4 = "4";
string str5 = "5";
string str6 = "6";
string str7 = "7";
string str8 = "8";
string str9 = "9";
string str10 = "10";
string interpolation = $"str1 = {str1}, str2 = {str2}, str3 = {str3}, str4 = {str4}, str5 = {str5}, str6 = {str6}, str7 = {str7}, str8 = {str8}, str9 = {str9}, str10 = {str10}";
string format = string.Format("str1 = {0}, str2 = {1}, str3 = {2}, str4 = {3}, str5 = {4}, str6 = {5}, str7 = {6}, str8 = {7}, str9 = {8}, str10 = {9}", str1, str2, str3, str4, str5, str6, str7, str8, str9, str10);

$ 雖然好用,但要注意的是在 C# 6 和之後更新的版本中才能使用這項功能。

參考資料

$ - 字串內插補點 (C# 參考)

Back to Basics: String Interpolation in C# - Rick Strahl’s Web Log