using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            string str1 = "HelloWorld";
            string str2 = "HelloWorld";
            //Console.WriteLine(str1 == str2);
            //Console.WriteLine(str1.Equals(str2));
            Console.WriteLine((object)str1 == (object)str2);//True
            Console.ReadKey();
        }
    }
}
是不是所有值为"HelloWorld"的字符串变量都指向同一对象,那字符串副本又是怎么回事?

解决方案 »

  1.   

    你看仔细书。
    因为都是开发时候写死的,代码优化时候,编译之后,str1和str2指向的就是同一个常量字符串被,运行时被放在字符串池中了。Equals是比较值是否相等== 是比较是否引用相同,你这里是常量,所以是相同的。
    如果你一个是str1的常量方式制定,另一个是console.readline获得,虽然输入一样,但还是引用不同。因为运行时的字符串,多个并不会放入字符串池,一定要放,需要调用string的方法。
      

  2.   

    引ls的Equals是比较值是否相等== 是比较是否引用相同,你这里是常量,所以是相同的。
      

  3.   

    c# string的“==”就是比较值
      

  4.   

    尽管 string 是引用类型,但定义相等运算符(== 和 !=)是为了比较 string 对象(而不是引用)的值。这使得对字符串相等性的测试更为直观。例如:      string a = "hello";
    string b = "h";
    // Append to contents of 'b'
    b += "ello";
    Console.WriteLine(a == b);
    Console.WriteLine((object)a == (object)b);这将先显示“True”,然后显示“False”,因为字符串的内容是相同的,但是 a 和 b 引用的不是同一个字符串实例。 
    string(C# 参考)
      

  5.   

    你在给str1赋值的时候,首先是在字符串常量池中查找,看该字符串是否已经存在,若不存在则将该字符串添加到字符串常量池,若存在则直接被引用。副本只是在对该字符串进行操作时出现的一个名词而已,完全没用必要关心的。
      

  6.   

    string类重载了 ==,!= 运算符,比对的不是对象引用了。