改善C#程序的方法-1 操作字符串


正確操作字符串

引言:
字符串是使用很頻繁的一種數據類型。
如果使用不慎,則會為一次字符串操作所帶來的額外性能開銷而付出代價。
下面從這幾個方面來探討如何正確操作字符串:

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}."; 
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM