当前位置:编程学习 > C#> 正文

C#中equals和==的区别有哪些

时间:2013-11-19类别:编程学习

C#中equals和==的区别有哪些

C#中equals和==的区别有哪些

 

C# 中有两种不同的相等:引用相等和值相等。


◎值相等是大家普遍理解的意义上的相等:它意味着两个对象包含相同的值。
◎引用相等意味着要比较的不是两个对象,而是两个对象引用,且两者引用的是同一个对象。

 

Equals:


下面的语句中,x、y 和 z 表示不为 null 的对象引用。

* 除涉及浮点型的情况外,x.Equals(x) 都返回 true。
* x.Equals(y) 返回与 y.Equals(x) 相同的值。
* 如果 x 和 y 都为 NaN,则 x.Equals(y) 返回 true。
* 当且仅当 x.Equals(z) 返回 true 时,(x.Equals(y) && y.Equals(z)) 才返回 true。
* 只要不修改 x 和 y 引用的对象,对 x.Equals(y) 的相继调用将返回相同的值。
* x.Equals(null) 返回 false。
 

==:


对于预定义的值类型,如果操作数的值相等,则相等运算符 (==) 返回 true,否则返回 false。

对于 string 以外的引用类型,如果两个操作数引用同一个对象,则 == 返回 true。
对于 string 类型,== 比较字符串的值。
 

Equals与==的区别

"==" : 操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。

"equals" : 操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。  
而字符串是一个特殊的引用型类型,在C#语言中,重载了string 对象的很多方法方法(包括equals()方法),使string对象用起来就像是值类型一样。

 
实例
  •  
  • C# 代码   复制
  •  using System;
     using System.Collections.Generic;
     using System.Linq;
     using System.Text;
     
    namespace ConsoleApplication1
     {
         class Person
         {
             private string name;
             public string Name
             {
                 get { return name; }
                 set { name = value; }
             }
             public Person(string name)
             {
                 this.name = name;
             }
         }
         class program
         {
             static void Main(string[] args)
             {
                 string a = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
                 string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
                 Console.WriteLine(a == b);
                 Console.WriteLine(a.Equals(b));
                 object g = a;
                 object h = b;
                 Console.WriteLine(g == h);
                 Console.WriteLine(g.Equals(h));
                 Person p1 = new Person("jia");
                 Person p2 = new Person("jia");
                 Console.WriteLine(p1 == p2);
                 Console.WriteLine(p1.Equals(p2));
                 Person p3 = new Person("jia");
                 Person p4 = p3;
                 Console.WriteLine(p3 == p4);
                 Console.WriteLine(p3.Equals(p4));
                 Console.ReadLine();
             }
         }
     }
    
     
    		
  •  

    输出结果

    true ,true ,false ,true ,false ,false ,true ,true 。
     

    总结如下:


    1、对于值类型,==和equals等价,都是比较存储信息的内容。
    2、对于引用类型,==比较的是引用类型在栈中的地址,equals方法则比较的是引用类型在托管堆中的存储信息的内容。
    3、对于string类要特殊处理,它是一个内部已经处理好了equals方法和==的类,故==和equals等价,都是比较存储信息的内容。
    4、对于一些自定义的类,我们有必要重载equals方法,否则它默认为基类的equals方法(基类没有重载Equals方法则为Object类中的Equals方法),他们的比较也为地址,而不是引用类型在托管堆中的存储信息的内容。
     

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐