建議1 正確操作字串

2021-07-31 11:50:41 字數 1432 閱讀 8523

字串是我們常用的基礎資料型別,如果使用不當,養成不好的習慣,會對程式造成額外的開銷。

建議:確保盡量少的裝箱

避免分配額外的記憶體空間

確保盡量少的裝箱

1:string str1 = "str1" + 9;

2:string str2 = "str2" + 9.tostring();

第一行**需要執行一次裝箱行為int 轉 object 轉 string

第二行**不需要執行裝箱,呼叫的是整形的tostring方法,直接從記憶體中進行轉換,效率要比裝箱高很多。

所以在使用值引用型別到字串的轉換並完成拼接時,應當避免使用操作符「+」來完成,而應該使用值引用型別提供的tostring方法。

裝箱之所以會帶來效能耗損,因為它需要完成下面的三個步驟:

1.首先,會為值型別在託管堆中分配記憶體。除了值型別本身所分配的記憶體外,記憶體總量還要加上型別物件指標和同步塊索引占用的記憶體。

2.將值型別的值複製到新分配的堆記憶體中。

3.返回已經成為引用型別的物件的位址。

避免分配額外的記憶體空間

string物件是乙個很特殊的物件,一旦賦值就不可改變。在執行時呼叫string類中的任何方法或進行任何運算(如「=」賦值、「+」拼接等),都會在記憶體中建立乙個新的字串物件,這也意味著要為新物件開闢乙個新的記憶體空間。 如:

string s1="abc"+"def"; //改**等效於 s1="abcdef"

s1="123"+s1+"456";

//以上**建立了3個字串物件

const string a="t";

string re1="abc"+a;

// 因為a是乙個常量,所以該**等效於 re1="abct";

微軟針對這種情況提供了stringbuilder來彌補。

stringbuilder不會重新建立乙個string物件,他的效率源於預先以非託管的方式分配記憶體。如果沒有定義長度,預設分配長度為16,實際長度小於16時不會重新分配記憶體,實際長度大於16小於32時,stringbuilder又會重新分配記憶體,使之成為16的倍數。

string a = "t";

string b = "e";

string c = "s";

string d = "t";

stringbuilder build = new stringbuilder(a);

另外,微軟還提供了一種簡化寫法,使用string.format方法,內部使用stringbuilder進行字串格式化。

string a = "t";

string b = "e";

string c = "s";

string d = "t";

string.format("", a, b, c, d);

建議1 正確操作字串

建議1 正確操作字串 字串應該是所有程式語言中使用最頻繁的一種基礎資料型別。如果使用不慎,我們就會為一次字串的操作所帶來的額外效能開銷而付出代價。本條建議將從兩個方面來 如何規避這類效能開銷 先來介紹第乙個方面,請看下面的兩行 string str1 str1 9 string str2 str2 ...

字串操作 1

a 大串中查詢子串出現的次數 public class substringdemo 方式2 不擷取字串,逐漸縮小查詢範圍 private static intgetcount2 string str,string regex return count 方式1 查詢到小串後將已經查詢的部分擷取掉。返回...

C 中如何正確的操作字串?

字串應該是所有程式語言中使用最頻繁的一種基礎資料型別。如果使用不慎,我們就會為一次字串的操作所帶來的額外效能開銷而付出代價。本條建議將從兩個方面來 如何規避這類效能開銷 1.確保盡量少的裝箱 2.避免分配額外的記憶體空間。第乙個方面 確保盡量少的裝箱 對於裝拆箱,我們應該不陌生,值型別轉換成引用型別...