知道為什麼要用內插字元串,只有踩過坑的人才能明白,如果你曾今使用string.format超5個以上占位符,那其中的痛苦我想你肯定是能夠共鳴的。 一:痛苦經歷 先上一段曾今寫過的一段代碼,大家來體會一下: 這裡擁有多達8個占位符,當年寫這個的時候,會有三個痛點。 1. 占位符不能寫錯了 比如這裡的 ...
知道為什麼要用內插字元串,只有踩過坑的人才能明白,如果你曾今使用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> 錯誤使用方式
如果你直接這麼寫,通過不了狠毒的編譯器,比如下麵這樣。
<2> 正確使用方式
解決方法也能簡單,在外圍加上一個()即可。
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}");
}
}
好了,本篇就說到這裡,希望對你有幫助。