c#中string的特性介紹及注意事項(xiàng)小結(jié)
前言
string類型在我們實(shí)際項(xiàng)目開發(fā)中是一個(gè)最使用的類型,string是一個(gè)引用類型這一點(diǎn)大家都知道,但是在實(shí)際使用過程中,大家會(huì)發(fā)現(xiàn)string和我們常見的引用類型使用還真不一樣,看下面的一個(gè)簡(jiǎn)單例子:
static void Main(string[] args) { string hello = "my name is yuanHong"; Console.WriteLine(string.Format("加工前的值:{0}", hello)); ///// 對(duì)hello進(jìn)行加工 MachHello(hello); Console.WriteLine(string.Format("加工后的值:{0}", hello)); Console.ReadLine(); } /// <summary> /// 對(duì)hello進(jìn)行加工 /// </summary> /// <param name="hello"></param> private static void MachHello(string hello) { hello = string.Format("{0},Nice to meet you",hello); }
程序運(yùn)行的實(shí)際結(jié)果是:前后值都一樣沒有發(fā)生改變,如果按照引用類型看分析,也該是加工前后期值是不一樣的,那是為什么呢?是不是有一種感覺字符串又像是值類型呢?好下面我們就一起探討一下string的特殊性所在。
string內(nèi)部實(shí)現(xiàn)簡(jiǎn)介
首先:是要說明的是string是被sealed修飾,不能繼承。
其次:通過上面的string底層源碼,我們發(fā)現(xiàn),在底層實(shí)現(xiàn)上實(shí)際上是用的char數(shù)組來實(shí)現(xiàn),在初始化一個(gè)字符串時(shí),系統(tǒng)都已經(jīng)初始化了char數(shù)組的大小。
string在創(chuàng)建時(shí)都固定化了大小,并且是只讀,不能修改
在實(shí)際使用過程中,我們對(duì)string的改變,實(shí)際上在內(nèi)部是重新創(chuàng)建了一個(gè)新的字符串
字符串在作為函數(shù)參數(shù)傳遞時(shí),實(shí)際上是拷貝了一份數(shù)據(jù)傳遞
最后:現(xiàn)在我們?cè)诨仡^看最開的程序結(jié)果我們就不難明白其為什么會(huì)出現(xiàn)這樣的現(xiàn)象了
string使用注意點(diǎn)
1、避免額外的存儲(chǔ)空間開銷
避免用+號(hào)來拼接字符串:
看下面的一個(gè)實(shí)例:
string str1 = "yuan"; str1 = str1 + "hong"; //// 這樣會(huì)創(chuàng)建兩個(gè)字符串3個(gè)字符串對(duì)象 string strNew = "yuan" + "hong";/// 等效于 strNew="yuanhong",其實(shí)在編譯后也就是這個(gè)效果 //// 只會(huì)創(chuàng)建一個(gè)字符串對(duì)象
再看一個(gè)實(shí)例:
//// 下面是兩種方式實(shí)現(xiàn)返回一個(gè)字符串123 //// 方式1 string v11="1"; string v22=v11+"2"; string v33=v22+"3"; retun v33; //// 采用方式1:系統(tǒng)會(huì)創(chuàng)建5個(gè)string對(duì)象 //// 方式2 //// 采用方式2:系統(tǒng)只會(huì)創(chuàng)建4個(gè)string對(duì)象 string v1="1"; string v2="2"; string v3="3"; retun v1+v2+v3; //// 從內(nèi)存開銷誰行來說,明顯方式2要優(yōu)于方式1
在實(shí)際開發(fā)中,如果對(duì)字符串對(duì)象頻繁的拼接操作,建議使用StringBuilder
當(dāng)然c#中也有一只簡(jiǎn)化字符串拼接方式:String.Format ,其實(shí)其內(nèi)部實(shí)現(xiàn)原理也就是 StringBuilder
2、盡量少的裝箱
直接上代碼實(shí)例:
string str1 = "yunghong" + 66; string str2 = "yunghong" + 66.ToString(); //// 查看編譯后的代碼,發(fā)現(xiàn)第一行代碼,需要有一個(gè)裝箱操作,裝箱操作,需要增加不必要的內(nèi)存開銷,第一:需要給值類型本身分布內(nèi)存,同時(shí)還要給類型指針和同板塊索引分配內(nèi)存開銷
總結(jié):
在實(shí)際開發(fā)中需要注意一下幾點(diǎn):
1、避免裝箱操作
2、避免使用+號(hào)拼接字符串
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)我們的支持。
上一篇:Unity UI或3D場(chǎng)景實(shí)現(xiàn)跟隨手機(jī)陀螺儀的晃動(dòng)效果
欄 目:C#教程
下一篇:C#字體池技術(shù)實(shí)現(xiàn)代碼詳解
本文標(biāo)題:c#中string的特性介紹及注意事項(xiàng)小結(jié)
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/4604.html
您可能感興趣的文章
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并打開的方法
- 01-10關(guān)于ASP網(wǎng)頁(yè)無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#停止線程的方法
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新聞效果的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#實(shí)現(xiàn)多線程下載文件的方法


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 04-02jquery與jsp,用jquery
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)