字符串驻留

string 类型是我们使用的最为频繁的引用类型,CLR为了提高字符串处理的效率,减少内存的开销,对string类型的创建做了特殊的处理。

1.string类型创建时使用的IL指令为ldstr(Load String),CLR使用一种类似于hash table的数据结构维护着大多数创建的string变量(部分特殊的string类型无法驻留)。hash table 的结构为[stringvalue,stringreference],当创建新的字符串时,CLR先扫描hash table,如果找到相同的stringvalue,就把stringreference返回给新的字符串变量。否则CLR在heap中创建新的string类型,并维护到hash table 中。

string str1 = "StringInternTest";
string str2 = "StringInternTest";
string str3 = "StringIntern" + "Test";

string.ReferenceEquals(str1, str2); // true
string.ReferenceEquals(str1, "StringInternTest"); //true

//以下两种情况,stringvalue+stringvalue CLR编译时先计算结果,然后再使用ldstr指令
string.ReferenceEquals(str1, str3); //true
string.ReferenceEquals(str1, "StringIntern" + "Test"); //true

2.对于stringvalue+stringvariable 和 stringvariable+stringvariable,CLR使用的IL指令为concat,所以驻留机制不会起作用,但我们可以使用string.Intern(stringvariable)进行手工驻留,string.Intern方法会在hash table中查找并维护计算的stringvalue。

string str1 = "StringInternTest";
string str2 = "StringIntern";
string str3 = "Test";
string str4 = str2 + "Test";
string str5 = str2 + str3;

string.ReferenceEquals(str1, str4); //false
string.ReferenceEquals(str1, str5); //false

//手工驻留
string.ReferenceEquals(str1, string.Intern(str4)); //true
string.ReferenceEquals(str1, string.Intern(str5)); //true

你可能感兴趣的:(字符串)