对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false。对于string 以外的引用类型,如果两个对象引用同一个对象,则 == 返回 true。对于 string 类型,== 比较字符串的值。
    ==操作比较的是两个变量的值是否相等。
    equals()方法比较的是两个对象的内容是否一致.equals也就是比较引用类型是否是对同一个对象的引用。
今天拜读anytao的大作时对string类有了新的认识,那就是string类型驻留即string.IsInterned这个方法,在vs中是这么定义的:
   // Summary:
   //         Retrieves a reference to a specified System.String.
    //
     // Parameters:
        //     str:
        //         A System.String.
      //
     // Returns:
  //         A System.String reference to str if it is in the common language runtime
                //         "intern pool"; otherwise null.
                //
                // Exceptions:
                //     System.ArgumentNullException:
                //         str is null.
                public static string IsInterned(string str);
在MSDN中解释如下:
如果 str 位于公共语言运行时"暂存池"中,则为对它的 String 引用;否则为 null 引用

公共语言运行时会自动维护一个名为"暂存池"的表,它包含在程序中声明的每个唯一字符串常数的单个实例,以及以编程方式添加的 String 的任何唯一实例。
暂存池可以节约字符串存储区。如果将字符串常数分配给几个变量,则每个变量设置为引用暂存池中的同一常数,而不是引用具有相同值的 String 的几个不同实例。
此方法在暂存池中查找 str。如果已经将 str 放入暂存池中,则返回对此实例的引用;否则返回 null 引用(在 Visual Basic 中为 Nothing
将此方法与 Intern 方法进行比较。
此方法不返回布尔值,但仍可以在需要布尔值的地方使用。

但该说明解释的并不十分清楚,大家可以通过下面的例子得到更多的信息:
       // Release : code09, 2008/08/25                
        // Author  : Anytao, http://www.anytao.com
        static void Main()
        {
            string s1 = "abc";
            string s2 = "ab";
            string s3 = s2 + "c";
 
            Console.WriteLine(ReferenceEquals(s1, s3));
        }
       // Release : code07, 2008/08/20        
        // Author  : Anytao, http://www.anytao.com
        public const string s1 = "abc"; 
        
        static void Main() 
        { 
            string s2 = "ab"; 
            s2 += "c"; 
            
            Console.WriteLine(string.IsInterned(s2) ?? "null"); 
        }
       // Release : code06, 2008/08/20        
        // Author  : Anytao, http://www.anytao.com
        static void Main() 
        { 
            string s2 = "ab"; 
            s2 += "c"; 
            
            Console.WriteLine(string.IsInterned(s2) ?? "null"); 
            
            string s1 = GetStr(); 
        }         
        
        private static string GetStr() 
        { 
            return "abc"; 
        }
       // Release : code08, 2008/08/20        
        // Author  : Anytao, http://www.anytao.com
        public static string s1 = "abc"; 
        
        static void Main() 
        { 
            string s2 = "ab"; 
            s2 += "c"; 
            
            Console.WriteLine(string.IsInterned(s2) ?? "null"); 
        }
以上代码转载自http://www.cnblogs.com/anytao/