前言
string型別在我們實際專案開發中是乙個最使用的型別,string是乙個引用型別這一點大家都知道,但是在實際使用過程中,大家會發現string和我們常見的引用型別使用還真不一樣,看下面的乙個簡單例子:
staticvoid main(string
args)
", hello));
///// 對hello進行加工
machhello(hello);
console.writeline(
string.format("
加工後的值:
", hello));
console.readline();
}//////
對hello進行加工
/// ///
private
static
void machhello(string
hello)
,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、避免使用+號拼接字串
c 中關於string的特性介紹以及注意事項
前言 string型別在我們實際專案開發中是乙個最使用的型別,string是乙個引用型別這一點大家都知道,但是在實際使用過程中,大家會發現string和我們常見的引用型別使用還真不一樣,看下面的乙個簡單例子 static void main string args hello 對hello進行加工 ...
c 中 String和string的區別介紹
不知道大家有沒有發現,在c string型別可以寫成string和string,那麼,它們有什麼區別呢?程式設計客棧 string是c 中的類 string是framework的類 c st程式設計客棧ring 對映為www.cppcns.com fr程式設計客棧amework的 string。如果...
關於 String 型別介紹
表示可變長的字串行,使用string型別前必須首先包含string標頭檔案 string a1 預設初始化 string a2 a1 a2是a1的副本 string a3 a1 等價於a3 a1 a3是a1的副本 string a4 hello world a4是字面值 hello world 的副...