正確操作字符串
引言:
字符串是使用很頻繁的一種數據類型。
如果使用不慎,則會為一次字符串操作所帶來的額外性能開銷而付出代價。
下面從這幾個方面來探討如何正確操作字符串:
1.確保盡量少的裝箱,盡可能避免編寫不必要的裝箱代碼
string str1 = "str1" + 8; //運行時會完成一次裝箱行為
string str2 = "str2" + 8.ToString(); //沒有發生裝箱行為,效率更高
2.避免分配額外的內存空間
在CLR中,string類是特殊的引用類型,string對象一旦被賦值就不可改變。
在運行是調用System.String類中的任何方法或進行任何運算(如“=”賦值,“+”拼接),都會在內存中創建一個新的字符串對象,
要為該新對象分配新的內存空間。
private void Method()
{
string str1 = "abc";
str1 = "123" + str1 + "456";
//以上代碼創建了3個字符串對象,並執行了一次string.Concat方法,會帶來運行時的額外開銷。
}
3.使用StringBuilder類
微軟提供的StringBuilder類型可以彌補String的不足。
StringBuilder不會重新創建一個string對象,它的效率源於預先以非托管的方式分配內存。
如果StringBuilder沒有預先定義長度,則默認分配的長度為16。
當StringBuilder字符長度≤16時,StringBuilder不會重新分配內存;
當長度大於16小於32時,StringBuilder會重新分配內存,使之成為16的倍數。
StringBuilder指定的長度要合適,太小了需要頻繁分配內存,太大了則浪費空間。
public static void Method1()
{
StringBuilder sb = new StringBuilder("我");
sb.Append("是");
sb.Append("一個");
sb.Append("程");
sb.Append("序");
sb.Append("員");
string str = sb.ToString();
}
4.使用string.Format方法
string.Format方法在內部使用StringBuilder進行字符串的格式化,可以簡化StringBuilder操作。
public static void Method2()
{
string str = string.Format("{0}{1}{2}{3}","我","是","一個","程序員");
}
5.使用內插字符串 $
內插字符串$是string.Format的語法糖,可以更直觀的表達參數。
public static void Method3()
{
var name = "小明";
var year = 20;
var job = "程序員";
var str = $"{name}的年齡是{year},工作是{job}.";
//注意:
//上條內插字符串中的year是int類型,會發生裝箱操作,影響性能
//可以優化為:var str = $"{name}的年齡是{year.ToString()},工作是{job}.";
}