日期:2014-05-18  浏览次数:20885 次

c#中的object类中的方法Equals的一个问题?一直困扰我
class Program
  {
  static void Main(string[] args)
  {
  string a = "aa"; string b = "aa";
  Console.WriteLine(object.Equals(a,b));
   
  }
  }
既然Equals方法是比较引用是否引用同一个对象,a和b虽然值相等但是是属于不同对象啊,怎么运行结果是true呢?

------解决方案--------------------
第一,object.Equals(a,b)是通过调用a和b的Equals方法来判断是否相等,而不是比较引用。
第二,string重写了Equals方法,比较值是否相等。
第三,string a = "aa"; string b = "aa"; 这种写法,编译器会优化为只生成一个"aa"对象,也就是a和b指向的是同一个对象,即使比较引用结果也是相等。
第四,string是引用类型,但是通过重写Equals方法和重载==操作符,使得在使用的时候表现的像值类型,但是不要把string当值类型。
------解决方案--------------------
这个问题,应该时.net再处理string 这个特殊类时使用的 字符串的驻留。当在初始化string 变量时,会先在托管堆中 查找是否有相同的VALUE。
因此,你上面的赋值,b实际上也是指向了a的引用地址,所以结果是TRUE


------解决方案--------------------
其实你给a和b指向的都是一个常量字符串,.net有字符串留用机制
但是下面的代码就返回false了,因为b是另分配的:
string a = "aa";
string b = string.Copy(a);

Console.WriteLine(object.ReferenceEquals(a, b).ToString());