日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

為什么要用內(nèi)插字符串代替string.format

 路人甲Java 2021-04-05

知道為什么要用內(nèi)插字符串,只有踩過(guò)坑的人才能明白,如果你曾今使用string.format超5個(gè)以上占位符,那其中的痛苦我想你肯定是能夠共鳴的。

一:痛苦經(jīng)歷

先上一段曾今寫過(guò)的一段代碼,大家來(lái)體會(huì)一下:

    LogHelper.WriteLog(string.Format(@"=== Square發(fā)送服務(wù)中  === 【第四步】 leaflet發(fā)送成功。  marketID={0}, 
                                       marketName={1}, 總共客戶:{2}, 成功:{3}人, 失敗:{4}人,重復(fù):{5}人,
                                       當(dāng)前優(yōu)先級(jí):{6},所屬shopID={7}",
                                      leafletEntity.MarketingID, leafletEntity.MarketingName, 
                                      leafletEntity.CustomerList.Count,leafletEntity.SuccessCount,
                                      leafletEntity.FailCount, leafletEntity.RepeatCustomerNum, 
                                      leafletEntity.Priority, leafletEntity.ShopID));

這里擁有多達(dá)8個(gè)占位符,當(dāng)年寫這個(gè)的時(shí)候,會(huì)有三個(gè)痛點(diǎn)。

1. 占位符不能寫錯(cuò)了

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

2. 參數(shù)值個(gè)數(shù)不能多也不能少

比如把最后的leafletEntity.ShopID 參數(shù)值給丟了,造成8個(gè)占位符,7個(gè)參數(shù)的現(xiàn)象,這樣就會(huì)造成系統(tǒng)拋異常。

3. 參數(shù)值順序不能錯(cuò)

參數(shù)值個(gè)數(shù)多了,很難保證順序沒(méi)被搞錯(cuò),比如這里的leafletEntity.FailCount和leafletEntity.RepeatCustomerNum,顛倒為leafletEntity.RepeatCustomerNum和leafletEntity.FailCount,你能一眼看出來(lái)嗎???

二:解決辦法

string.format也是曾今模仿C語(yǔ)言留下來(lái)的歷史遺留問(wèn)題,如今C#6.0出來(lái)了這個(gè)內(nèi)插字符串完美的解決了這三個(gè)問(wèn)題,簡(jiǎn)直不要太興奮,接下來(lái)把文章開頭處改成內(nèi)插版。

            LogHelper.WriteLog($@"=== Square發(fā)送服務(wù)中  === 【第四步】 leaflet發(fā)送成功。 
                                  marketID={leafletEntity.MarketingID}, 
                                  marketName={leafletEntity.MarketingName}, 
                                  總共客戶:{leafletEntity.CustomerList.Count},
                                  成功:{leafletEntity.SuccessCount}人, 
                                  失敗:{leafletEntity.FailCount}人,
                                  重復(fù):{leafletEntity.RepeatCustomerNum}人,
                                  當(dāng)前優(yōu)先級(jí):{leafletEntity.Priority},
                                  所屬shopID={leafletEntity.ShopID}");

內(nèi)插字符串法僅僅就是在字符串前面加上"$"即可,給點(diǎn)時(shí)間大家仔細(xì)品味一下,是不是很好的解決了我之前提到的3個(gè)痛點(diǎn)。

1. 三目運(yùn)算符在內(nèi)插法的使用

很多時(shí)候在業(yè)務(wù)開發(fā)中,不能僅僅是填充一個(gè)變量,而最好還應(yīng)該支持一些表達(dá)值,如使用最多的三目運(yùn)算符

<1> 錯(cuò)誤使用方式

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

<2> 正確使用方式

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

2. 復(fù)雜邏輯的內(nèi)插法使用

如果你有復(fù)雜的業(yè)務(wù)邏輯,建議單獨(dú)另起一個(gè)方法。

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

如何你的業(yè)務(wù)邏輯相對(duì)比較簡(jiǎn)單,可以用內(nèi)聯(lián)委托的方式實(shí)現(xiàn)。

三:探究原理

接下來(lái)探究一下,內(nèi)插字符串這種語(yǔ)法糖在IL層面到底是個(gè)啥玩意,你可以通過(guò)ILSpy工具查看IL代碼。

從上面的截圖來(lái)看,其實(shí)所謂的“內(nèi)插字符串”就是string.format,編譯器的語(yǔ)法糖而已

注意點(diǎn):

因?yàn)橛幸粋€(gè)box操作,所以你要當(dāng)點(diǎn)心,如果Console.WriteLine多次執(zhí)行會(huì)有一定的性能損失,建議提前做好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}");
            }
        }

好了,本篇就說(shuō)到這里,希望對(duì)你有幫助。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多