如何在 C# 中使用 插值字串?

語言: CN / TW / HK

字串插值是一種將 表示式 插入到字串字面量中的一種技術,又稱為變數替換,變數插值,變數展開 等等,它是一種用相應值替換字串中的一個或者更多個佔位符的處理過程。

字串插值被很多程式語言所採用,比如說:Python,Perl,PHP,Ruby,Java,Scala 等等, C# 是在第六個版本中引入的,這篇文章我們將會討論如何在 C# 中使用 字串插值。

字串插值 的結構

從語言層面上來說,字串插值就是一個包含插值表示式的string,這個string中的某一個插值最終都會被一個實際值所替代。

插值字串是用 $ 開頭的,此外   $ 和字串字面量之間不能有任何空格,下面的語言展示了 插值表示式 的語法結構。


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

注意方括號內的元素是可選的。 interpolationExpression 元素表示生成結果或輸出字串的表示式。 alignment 表示一個常量表達式,其值指定在計算表示式時必須包含在表示式結果的字串表示形式中的最小字元數。如果值為正數,則字串表示為右對齊;如果值為負數,則字串表示為左對齊。 formatString 顧名思義,表示一個格式字串。

建立 字串插值

當使用字串插值時,必須首先在字串之前插入一個 $ 字元,而不是單獨為每一個元素單獨格式化。

一個插值表示式必須包含在一個左大括號和一個右大括號內 ({}) 。下面的程式碼片段展示瞭如何使用字串插值來將字串替換為文字值。


var name = "Joydip";
Console.WriteLine($"Hello, {name}");

接下來考慮下面的程式碼段。


string productName = "Lenovo Legion Laptop";
int counter = 5;
string output = string.Format("Today, {0} has been sold {1} times.",
productName, counter);

當把程式碼執行起來後,output 內容輸出如下:


Today, Lenovo Legion Laptop has been sold 5 times.

現在用 插值法 來改造一下,參考結果如下:


string productName = "Lenovo Legion Laptop";
int counter = 5;
string output = $"Today, {productName}, has been sold {counter} times.";

插值字串必須在編譯時就能確定

插值字串看起來像是一個建立 字串模板 的簡單方式,但你必須要意識到,插值字串在 C# 中僅僅是一個編譯時語法糖而已,換句話說,你的插值字串必須在編譯時就是一個普通的字串字面量。

外掛字串中使用特殊字元

接下來我們來學習下,如何在 插值字串 中使用特殊字元,考慮下面的例子。


string productName = "Lenovo Legion Laptop";
double price = 1600.00;
Console.WriteLine($"The customer asked, \"What is the price of {productName}?\"");
Console.WriteLine($"The salesman replied saying that the price of {productName} is ${price}.");

正如你看到的,如果包含特殊字元,必須用 \ 進行轉義,字串插值允許我們插入一個 value 到字串中,並還能控制最後生成的輸出結果,從語言層面來說,字串插值最後會變成 String.Format,相反,如果字串插值是 IFormattable 或者 FormattableString 型別,那麼編譯器會呼叫 FormattableStringFactory.Create 方法。

理論上來說,字串插值稍微降低了程式的效能,但 .NET 最近的幾個版本已經做了很大的優化,同時 字串插值 所帶來的靈活性遠超這個所謂的效能。