日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

为什么要用内插字符串代替string.format

發布時間:2023/12/4 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么要用内插字符串代替string.format 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

知道為什么要用內插字符串,只有踩過坑的人才能明白,如果你曾今使用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個占位符,當年寫這個的時候,會有三個痛點。

1. 占位符不能寫錯了

比如這里的 {0},{1},{2}.... 不能寫成了 {0},{0},{2},造成結果的重復輸出。

2. 參數值個數不能多也不能少

比如把最后的leafletEntity.ShopID 參數值給丟了,造成8個占位符,7個參數的現象,這樣就會造成系統拋異常。

3. 參數值順序不能錯

參數值個數多了,很難保證順序沒被搞錯,比如這里的leafletEntity.FailCount和leafletEntity.RepeatCustomerNum,顛倒為leafletEntity.RepeatCustomerNum和leafletEntity.FailCount,你能一眼看出來嗎???

二:解決辦法

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個痛點。

1. 三目運算符在內插法的使用

很多時候在業務開發中,不能僅僅是填充一個變量,而最好還應該支持一些表達值,如使用最多的三目運算符

<1 style="box-sizing: border-box;"> 錯誤使用方式

如果你直接這么寫,通過不了狠毒的編譯器,比如下面這樣。

<2 style="box-sizing: border-box;"> 正確使用方式

解決方法也能簡單,在外圍加上一個()即可。

2. 復雜邏輯的內插法使用

如果你有復雜的業務邏輯,建議單獨另起一個方法。

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}");}}

好了,本篇就說到這里,希望對你有幫助。

總結

以上是生活随笔為你收集整理的为什么要用内插字符串代替string.format的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。