知道爲何要用內插字符串,只有踩過坑的人才能明白,若是你曾今使用string.format超5個以上佔位符,那其中的痛苦我想你確定是可以共鳴的。工具
先上一段曾今寫過的一段代碼,你們來體會一下:性能
LogHelper.WriteLog(string.Format(@"=== Square發送服務中 === 【第四步】 leaflet發送成功。 marketID={0}, marketName={1}, 總共客戶:{2}, 成功:{3}人, 失敗:{4}人,重複:{5}人, 當前優先級:{6},所屬shopID={7}", leafletEntity.MarketingID, leafletEntity.MarketingName, leafletEntity.CustomerList.Count,leafletEntity.SuccessCount, leafletEntity.FailCount, leafletEntity.RepeatCustomerNum, leafletEntity.Priority, leafletEntity.ShopID));
這裏擁有多達8個佔位符,當年寫這個的時候,會有三個痛點。3d
好比這裏的 {0},{1},{2}.... 不能寫成了 {0},{0},{2},形成結果的重複輸出。code
好比把最後的leafletEntity.ShopID 參數值給丟了,形成8個佔位符,7個參數的現象,這樣就會形成系統拋異常。
orm
參數值個數多了,很難保證順序沒被搞錯,好比這裏的leafletEntity.FailCount和leafletEntity.RepeatCustomerNum,顛倒爲leafletEntity.RepeatCustomerNum和leafletEntity.FailCount,你能一眼看出來嗎???
blog
string.format也是曾今模仿C語言留下來的歷史遺留問題,現在C#6.0出來了這個內插字符串完美的解決了這三個問題,簡直不要太興奮,接下來把文章開頭處改爲內插版。開發
LogHelper.WriteLog($@"=== Square發送服務中 === 【第四步】 leaflet發送成功。 marketID={leafletEntity.MarketingID}, marketName={leafletEntity.MarketingName}, 總共客戶:{leafletEntity.CustomerList.Count}, 成功:{leafletEntity.SuccessCount}人, 失敗:{leafletEntity.FailCount}人, 重複:{leafletEntity.RepeatCustomerNum}人, 當前優先級:{leafletEntity.Priority}, 所屬shopID={leafletEntity.ShopID}");
內插字符串法僅僅就是在字符串前面加上"$"便可,給點時間你們仔細品味一下,是否是很好的解決了我以前提到的3個痛點。字符串
不少時候在業務開發中,不能僅僅是填充一個變量,而最好還應該支持一些表達值,如使用最多的三目運算符編譯器
若是你直接這麼寫,經過不了狠毒的編譯器,好比下面這樣。string
解決方法也能簡單,在外圍加上一個()便可。
若是你有複雜的業務邏輯,建議單獨另起一個方法。
class Program { static void Main(string[] args) { var num = 10; var info = $"i={GetNum(num)}"; } public static int GetNum(int num) { return num == 10 ? 1 : 2; } }
如何你的業務邏輯相對比較簡單,能夠用內聯委託的方式實現。
接下來探究一下,內插字符串這種語法糖在IL層面究竟是個啥玩意,你能夠經過ILSpy工具查看IL代碼。
從上面的截圖來看,其實所謂的「內插字符串」就是string.format,編譯器的語法糖而已
由於有一個box操做,因此你要當點心,若是Console.WriteLine屢次執行會有必定的性能損失,建議提早作好box操做,例以下面這樣。
static void Main(string[] args) { int i = 1, j = 2, k = 3; var it = i.ToString(); var jt = j.ToString(); var kt = k.ToString(); for (int m = 0; m < int.MaxValue; m++) { Console.WriteLine($"i={it},j={jt},k={kt}"); } }
好了,本篇就說到這裏,但願對你有幫助。