什么是字符串池机制?
字符串池机制致力于改善程序的性能。
CLR 会保留程序中出现过的字符串对象的集合,并且在需要新的字符串时,先检查已有的集合,在查找成功时返回已有对象的引用。
字符串池机制可以通过程序集元数据特性进行控制,C# 默认的机制是打开字符串池机制。
csharp
using System;
namespace StringPool
{
class Program
{
static void Main(string args)
{
// 两个字符串对象,理论上引用应该不相等
// 但由于字符串池的机制,两者实际指向同一对象
string a = "abcde";
string b = "abcde";
Console.WriteLine(Object.ReferenceEquals(a, b)); // True
// 这行代码等同于 c = "abcde"
// 由于字符串池,c 和 a 还是指向同一对象
string c = "a" + "b" + "c" + "d" + "e";
Console.WriteLine(Object.ReferenceEquals(a, c)); // True
// 显示使用 new 来分配内存
// 这时候字符串池机制不能起作用,d 和 a 指向不同对象
Char chars = { 'a', 'b', 'c', 'd', 'e' };
string d = new string(chars);
Console.WriteLine(Object.ReferenceEquals(a, d)); // False
Console.Read();
}
}
}