string 字符串性能
定義語法:string s=」abc」 string str=new string(new char[]{‘a’,’b’,’c’})ui
string和Stringspa
string is an alias for String in the .Net Framework線程
string 是String的別名,string是C#的類型,String是.Net Framework的類型3d
string通過編譯變成String,爲了符合語法,建議使用string指針
Immutable字符串不變性blog
代碼分析:進程
string s=」abc」 在堆上開闢空間存儲變量s的值」abc」,在棧上存儲s,將指針指向堆上的地址內存
s=」abcd」 在堆上開闢空間存儲變量s的值」abcd」,將棧上的s指向的地址指向」abcd」字符串
由圖可知,字符串不變性是指字符串值的變動,原有值並不會馬上從內存中消失,而是等待GC回收,所以在有頻繁字符串的切割、拼接等字符操做時,應當使用StringBuilder
Intern Pool 駐留池
駐留池是指CLR維護的一個HashTable,鍵爲字符串的值,值爲字符串在堆中的地址,存儲的字符串是字面量字符串,當新的字面量字符串新建時,
若是駐留池中存在同值字符串,則新的字符串的引用指向該字符串的地址。
字面量字符串,string str=」abc」 string str=@」abc」 string str=」abc」+」def」
英文雙引號包括的或@+英文雙引號包括的
代碼分析:
string s=」abc」 在堆區開闢空間存儲變量s,在棧中存儲s,並將引用指向堆中地址
string b=」abc」 檢查駐留池中是否有」abc」,存在,在棧中新建變量b,將引用指向堆
變量b和s在堆中地址一致,說明駐留池機制也說明了字符串的不變性。
同時駐留池的存活週期同程序進程一致,爲字符串的線程同步提供基礎,即駐留池中的字符串是進程級
string和StringBuilder
StringBuilder 動態串,從字面意思來看,StringBuilder是的長度是能夠變化的
StringBuilder是值類型,是爲處理複雜頻繁的字符串操做而存在的
代碼分析:
StringBuilder sb=new Stringbuilder(「Hahaha」) 在堆中開闢空間存儲變量sb,值爲」Hahaha」,在棧中存sb,引用指向堆中地址
sb.Append(「123」) 根據棧中引用找到堆中地址,當初始分配內存不足,自動擴展,並將存放值變爲」Hahaha123」
由圖可看出StringBuilder是對同一塊內存操做,而字符串的更改會佔用內存,所以對於頻繁的字符串操做
用StringBuilder,而對於次數較少用string,由於StringBuilder對內存操做佔用CPU,在必定程度上影響性能。