C#關於String暫存池(常量池)


string作為最常用的類型,在實際項目中會有大量的字符串操作,這樣會帶來大量的字符串創建,內存分配、回收,進而影響性能。因此CLR對於string進行了特殊的優化,CLR中存在字符串暫存池概念。那么CLR 如何做到的呢?在CLR初始化時創建一個內部的哈希表,這個表相當於一個字典表,鍵就是字符串,值是指向托管堆中該字符串對象的引用。(具體詳看原文鏈接:https://blog.csdn.net/xiaouncle/article/details/87832198)

以下內容由原文得到:

紅色部分代表進行比較的變量

不是所有的字符串都放在暫存池中,以下三種情況會查詢暫存池(若查詢不到就將其存入暫存池)(引用地址相同):

利用字面量值創建string對象:

//String str1 = “999”;String str2 = “999”;

利用string.Intern()創建string對象:

//StringBuilder sb1 = new StringBuilder(“99999”);string str1 = “99999”;string str2=string.Intern(sb1.ToString);

字面量值+字面量值拼接創建string對象:

//sb1 = “99”;sb2=”999”;str1=”999”;str2=”99”;sb1+str1;sb2+str2;

所以不會查詢暫存池的情況有(引用地址不同):

str.Tostring();

//str1=”999”;str2=str1.ToString();

char[].ToString();

//str1=”999”;char[] charArray=str1.ToArray();str2=charArray.ToString();

new String();

//(1)str1=”999”;char[] charArray = str1.ToArray();string str2 = new string(charArray);string str3 = new string(charArray);

字面量值+非字面量值

//char[] charArray = {‘9’,’9’};str1 = “99999”;str2 =”999”+charArray.Tostring();

非字面量值+非字面量值

//char[] charArray1 = {‘9’,’9’};char charArray2 = {‘9’,’9’,’9’};

str1 =”99999”;str2=charArray1.ToString()+charArray2.ToString();


免責聲明!

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



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