.net中的string表达的是常量字符串。
JIT编译器编译时判断遇到的常量字符串是否在内部散列表中,如果不在,添加进去。当第一次执行到含字符串的方法时,CLR会检查该字符串是否在内部的一个散列表中,这个散列表的key是字符串,value是字符串的引用,如果不在就增加一个对该字符串的条目进去,如果在直接取其引用即可。
还可以通过string Intern(string str)方法把一些动态字符串加入到内部散列表中,实现驻留。
实例程序:
任意地方出现的字符串"string test"的所有引用都相等,
static void Main(string[] args) { string a = "string test"; string b = "string test"; Console.WriteLine(object.ReferenceEquals(a, b)); compareString(a); compareString(b); } static void compareString(string s) { string temp = "string test"; Console.WriteLine(object.ReferenceEquals(temp, s)); } /* True True True */