林子大了,什么鸟都有----.NET运用String的十八层境界
林子大了,什么鳥都有----.NET運(yùn)用String的十八層境界
在上一文中,提到了一句相當(dāng)常見但十分荒謬的代碼:Request.QueryString["id"].ToString()。突然涌起一個(gè)想法,為什么不總結(jié)一下不同層次.Net開發(fā)者如何運(yùn)用string的呢?
古往今來(lái),文本處理一直是所有編程語(yǔ)言的最基礎(chǔ)的功能,也是最核心最重要的功能。任何初學(xué)者,如果想學(xué)一門編程語(yǔ)言,都要面對(duì)大量的文本處理。而或許有一天,即使你成了大師級(jí)的人物,也不敢說(shuō)自己駕馭文本處理的能力,就已登峰造極。對(duì)String理解和運(yùn)用,應(yīng)該可以很好地代表開發(fā)者的專業(yè)水平。
寫Request.QueryString["id"].ToString()的顯然屬于比較初級(jí)的層次,那么專業(yè)一點(diǎn)的層次有什么表現(xiàn)呢?在本文,就試圖歸納劃分一下這水平的層次或境界,并抓些現(xiàn)行給大家參考。
一、入門級(jí)
第一層
初涉江湖。String就是這樣:string s =”abc”,帶倆雙引號(hào)這就是個(gè)String。有天分很快發(fā)現(xiàn)string還可以相加。
但是,一說(shuō)到說(shuō)什么引用類型?值類型?唉,我好模糊啊……
第二層
不變應(yīng)萬(wàn)變。label1.Text = n,報(bào)錯(cuò)說(shuō)類型不兼容?原來(lái)還要ToString()一下。于是吐絲準(zhǔn)成了此類.Net程序員的必殺技,Request.QueryString[id].ToString()就是最常見的例子。
第三層
如魚得水。學(xué)會(huì)用Convert.ToInt32之類方法轉(zhuǎn)換字符串,轉(zhuǎn)過(guò)去,轉(zhuǎn)回來(lái)。
來(lái)挖挖墳,看看早期的.Net程序員就已十分專業(yè):?如何把string解析為int??好在初學(xué)C#時(shí)我沒(méi)看到此文。
第四層
世界真奇妙。光個(gè)String類型就有這么多方法,這怎么記不住啊,每個(gè)都?jí)蜓芯總€(gè)幾天,比如?關(guān)于string.Join()的妙用與疑惑?、String.Substring()使用注意, 還有分析Trim、IndexOf、Split等等不逐一列舉了,過(guò)去都是園子首頁(yè)的常客。
(題外話:一下子都研究明白了生活就沒(méi)意思了,經(jīng)常驚嘆下“原來(lái)還有這個(gè)”不是挺好的)
二、菜鳥級(jí)
第五層
聽說(shuō)了字符串不要+拼接,要用StringBuilder,不然效率太低。
這篇還不錯(cuò),不過(guò)題目有點(diǎn)浮:徹底研究StringBuilder。StringBuilder要徹底研究還真不簡(jiǎn)單,不過(guò)除了極懶的一小撮外,基本算是普及了。
第六層
會(huì)用靜態(tài)方法啦:比如String.IsNullOrEmpty,但是對(duì)String.Format方法,還是要糾結(jié)好久吧。要是你會(huì)String.Concat,會(huì)區(qū)別它與StringBuilder用的場(chǎng)合,恭喜你,你的水平離.Net社區(qū)牛人—老趙也就差一年多了(?重談字符串連接性能?)。
第七層
ToString的格式輸出,名堂真多:C代表錢,D代表整數(shù),E是指數(shù),F是小數(shù),y是年,大寫M是月,小寫m是分鐘……? 這哪記得住?
其實(shí),能記住前幾種就不錯(cuò)了,知道用時(shí)去查就好(C# 格式化字符串)。尤其,要分清大MM和小mm的區(qū)別。只需三分鐘,飛越第七層。
第八層
開始從多個(gè)場(chǎng)景,如文件中,取得字符串。了解很多該用String表示的東西,很多不是String的東西,心有靈犀一點(diǎn)通,告別了盲目的類型轉(zhuǎn)換。
此層說(shuō)深不深,可以一跳而過(guò);說(shuō)淺不淺。我們公司有個(gè)WebService項(xiàng)目超級(jí)規(guī)范,全部方法參數(shù)、全部返回的實(shí)體屬性清一色的string類型。對(duì)讀取文件,至今許多有多年開發(fā)經(jīng)驗(yàn)同行的仍然云里霧里,應(yīng)該也包括偶。一個(gè)博問(wèn)中問(wèn)題:請(qǐng)教200M大的TXT文件如何快速讀取,有誰(shuí)能迅速給出標(biāo)準(zhǔn)實(shí)現(xiàn)的?
三、上手級(jí)
第九層:
學(xué)會(huì)了翻轉(zhuǎn)字符串,真的!恭喜,根據(jù)磚家定義,你已超越北大菜鳥級(jí)別了(為什么我要反對(duì)北大青鳥)。
第十層:
會(huì)用foreach遍歷String中的字符,明白了編碼方式?jīng)Q定字符串中的字符,是一個(gè)字節(jié),還是兩個(gè)或更多。
編碼是個(gè)大學(xué)問(wèn),偶一看就暈,就這么湊合著過(guò)了吧。您力所能及的話,還是建議深入了解下:字符集和字符編碼(Charset & Encoding)
第十一層:
開始從流中讀取字符串,偶爾還會(huì)重寫下ToString方法 (文件流轉(zhuǎn)換為string?)。
流是現(xiàn)代編程語(yǔ)言的最重要的基本對(duì)象模型,和String地位相當(dāng)。接觸了這兩者之間的聯(lián)系,對(duì)一門語(yǔ)言的認(rèn)識(shí)開始立體起來(lái)。
第十二層:
處理的字符串工作日漸繁重,直到一天發(fā)現(xiàn)了正則表達(dá)式,腰不酸了,腿不疼了。
我看的是這種正則表達(dá)式30分鐘入門教程,結(jié)果花了無(wú)數(shù)個(gè)30分鐘,還是沒(méi)入門。不過(guò)還是值的,確實(shí)有時(shí)候比寫代碼處理容易得多,甚至是救命稻草,此時(shí)更高端的我們都不會(huì)。
四、達(dá)人級(jí)
第十三層:
一日突然被問(wèn)到:string a = “a”+ “b”分配了幾次內(nèi)存?
蒙了,String是什么,Immutable、引用類型、拘留池、程序域,概念大爆發(fā)開始了。
年前的面試經(jīng)歷(二)?,獻(xiàn)丑一下,精彩的是評(píng)論。
第十四層:
見到不是一個(gè)字符串,而是對(duì)一組編碼字節(jié)的引用,是所謂見山不是山。
[你必須知道的.NET]第二十二回?中的一段話 “string真是一個(gè)豐富而多彩的技術(shù)倉(cāng)庫(kù),飽含了.NET技術(shù)中很多精髓與技巧"。
第十五層:
諸如BinaryReader(Writer)/StringReader(Writer),都已不在話下。
看老趙的隨筆:淺談字節(jié)序(Byte Order)及其相關(guān)操作。
第十六層:
開始在String類源代碼中尋找疑問(wèn)的答案。
.Net Discovery 系列之一--string從入門到精通
五、大師級(jí)
第十七層:
無(wú)招勝有招,這種境界,打自動(dòng)機(jī),寫編譯器,跟玩似的。
園中的腦袋,大概接近了此境界:自己動(dòng)手開發(fā)編譯器(一)編譯器的模塊化工程?。
第十八層:
見山還是山。重寫個(gè)String類型都毫無(wú)壓力了吧,其實(shí)什么類型方法都成了浮云。傳說(shuō)中的境界……
腦袋的級(jí)別再往上,或許變成了這樣:
不要崇拜哥,哥只是傳說(shuō)。
轉(zhuǎn)載于:https://www.cnblogs.com/shenzhenjia/archive/2011/07/29/2121601.html
總結(jié)
以上是生活随笔為你收集整理的林子大了,什么鸟都有----.NET运用String的十八层境界的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 茅台30年多少钱啊?
- 下一篇: Ajax_ASP.NET 添加 Ajax