囧,对C#驻留池(Intern Pool)机制的误解

尼玛,囧死了。学了C#有段时间了,居然不知道这个。。。

我们都知道C#中的有个(Intern Pool)驻留池,当初居然认为所有的字符串都会存放在此。前两天看了书才知道没那么简单。

1. 驻留池由CLR来维护,其中的所有字符串对象的值都不相同。

2. 只有编译阶段的文本字符常量会被自动添加到驻留池。

3.运行时期动态创建的字符串不会被加入到驻留池中

因此即使这个动态创建的字符串和驻留池中的某个字符串的值相等,引用也不会相等。

即使是动态创建的两个字符串的值相等,他们的引用依然不相等

            DateTime dt = DateTime.Now;

            string tt1 = dt.ToString();
            string tt2 = dt.ToString();

            Console.WriteLine("tt1: {0}\ntt2: {1}", tt1, tt2);
            
            if ((object)tt1 == (object)tt2)
            {
                Console.WriteLine("is true");
            }
            else
            {
                Console.WriteLine("is false");
            }
            //Output://tt1: 2013/1/13 16:24:02
            //         tt2: 2013/1/13 16:24:02
            //         is false

4. 可以使用静态方法String.Intern(string)把动态创建的字符串加入到驻留池中。

具体使用见MSDN


你可能感兴趣的:(学习杂记,C#)