前言
string型別在我們實際專案開發中是一個最使用的型別,string是一個參考型別這一點大家都知道,但是在實際使用程序中,大家會發現string和我們常見的參考型別使用還真不一樣,看下面的一個簡單例子:
static void Main(string[] args) { string hello = "my name is yuanHong"; Console.WriteLine(string.Format("加工前的值:{0}", hello)); ///// 對hello進行加工 MachHello(hello); Console.WriteLine(string.Format("加工后的值:{0}", hello)); Console.ReadLine(); } /// <summary> /// 對hello進行加工 /// </summary> /// <param name="hello"></param> private static void MachHello(string hello) { hello = string.Format("{0},Nice to meet you",hello); }
程式運行的實際結果是:前后值都一樣沒有發生改變,如果按照參考型別看分析,也該是加工前后期值是不一樣的,那是為什么呢?是不是有一種感覺字串又像是值型別呢?好下面我們就一起探討一下string的特殊性所在,
string內部實作簡介
首先:是要說明的是string是被sealed修飾,不能繼承,
其次:通過上面的string底層原始碼,我們發現,在底層實作上實際上是用的char陣列來實作,在初始化一個字串時,系統都已經初始化了char陣列的大小,
string在創建時都固定化了大小,并且是只讀,不能修改
在實際使用程序中,我們對string的改變,實際上在內部是重新創建了一個新的字串
字串在作為函式引數傳遞時,實際上是拷貝了一份資料傳遞
最后:現在我們在回頭看最開的程式結果我們就不難明白其為什么會出現這樣的現象了
string使用注意點
1、避免額外的存盤空間開銷
避免用+號來拼接字串:
看下面的一個實體:
string str1 = "yuan";str1 = str1 + "hong";//// 這樣會創建兩個字串3個字串物件string strNew = "yuan" + "hong";/// 等效于 strNew="yuanhong",其實在編譯后也就是這個效果
//// 只會創建一個字串物件
再看一個實體:
//// 下面是兩種方式實作回傳一個字串123//// 方式1 string v11="1";string v22=v11+"2";string v33=v22+"3";retun v33;//// 采用方式1:系統會創建5個string物件//// 方式2//// 采用方式2:系統只會創建4個string物件string v1="1";string v2="2";string v3="3";retun v1+v2+v3;//// 從記憶體開銷誰行來說,明顯方式2要優于方式1
在實際開發中,如果對字串物件頻繁的拼接操作,建議使用StringBuilder
當然c#中也有一只簡化字串拼接方式:String.Format ,其實其內部實作原理也就是 StringBuilder
2、盡量少的裝箱
直接上代碼實體:
string str1 = "yunghong" + 66;string str2 = "yunghong" + 66.ToString();//// 查看編譯后的代碼,發現第一行代碼,需要有一個裝箱操作,裝箱操作,需要增加不必要的記憶體開銷,第一:需要給值型別本身分布記憶體,同時還要給型別指標和同板塊索引分配記憶體開銷
總結:
在實際開發中需要注意一下幾點:
1、避免裝箱操作
2、避免使用+號拼接字串
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/5906.html
標籤:ASP.NET
上一篇:在Asp.Net或.Net Core中配置使用MarkDown富文本編輯器有開源模板代碼(代碼是.net core3.0版本)
下一篇:在IIS中如何設定域名
