黑马程序员技术交流社区

标题: C#中equals和 ==的区别 [打印本页]

作者: 狄琛林    时间: 2012-9-17 10:49
标题: C#中equals和 ==的区别
本帖最后由 狄琛林 于 2012-9-18 10:47 编辑

C#中equals和 ==的区别是什么?最好详细点啊.
作者: 许庭洲    时间: 2012-9-17 10:58
使用场景:
1.若比较两个基本类型的数值是否相等,用“==”来比较;
2.若比较两个引用变量对象的值是否相等,则要用对象的equals()方法进行比较;
作者: 孔德智    时间: 2012-9-17 11:03
Equals方法对于值类型和引用类型的定义不同,对于值类型,类型相同,并且数值相同(对于struct的每个成员都必须相同),则Equals返回true,否则返回false。而对于引用类型,默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时候才返回true。可以根据需要对Equals进行重载,例如String类的Equals用于判断两个字符串的内容是否相等。
   StringBuilder a = new StringBuilder();
   a.Append("the test a");
   String s1 = a.ToString();
   String s2 = "the test a";
   if (s2 == s1) //为真,因为S2,S1内容相等。String类的==与Equals的行为相同,判断两个字符串的内容是否相等
   Console.WriteLine("== returns true");
   if (Object.Equals(s2, s1)) //为真,String类重载了Equals,用于判断两个字符串的内容是否相等
   {
   Console.WriteLine("equals returns true");
   }
   if (Object.ReferenceEquals(s2, s1)) //为假,因为s2,s1并不是指向同一个对象
   {
   Console.WriteLine("ReferenceEquals returns true");
   }
   这个实例将输出:
   == returns true
   equals returns true


==是一个可以重载的二元操作符,可以用于比较两个对象是否相等。
   对于内置值类型,==判断的是两个对象的代数值是否相等。它会根据需要自动进行必要的类型转换,并根据两个对象的值是否相等返回true或者false。例如:
   Int a = 100;
   Double b =100;
   If(a == b)
   Console.WriteLine(“equal supports compare between different types!”);
   上面这段程序将会输出:
   equal supports compare between different types!
   而对于用户定义的值类型,如果没有重载==操作符,==将是不能够使用的。例如:
   Struct Userstruct1;
   Userstruct1 a;
   Userstruct1 b;
   If(a == b)
   Console.WriteLine(“can == reach this far?”)
   上面的这段代码是不能够通过编译的。可以通过重载使==作用于用户定义的值类型。
作者: 彭张铨    时间: 2012-9-17 15:59
==是判断引用是否相同,即是否指向同一个对象
Equals默认也是判断引用,但是有的类会重写(overrid)这个方法(Object.Equals)实现特殊的比较相等
作者: 王锋华    时间: 2012-9-17 22:09
==
对于预定义的值类型,如果操作数的值相等,则相等运算符   (==)   返回真,否则,返回假。对于除   string   类型以外的引用类型,如果两个操作数引用相同的对象,则   ==   返回真。对于   string   类型,==   将比较字符串的值。
确定两个   Object   实例是否相等。

Equals
确定两个   Object   实例是否相等。

另外,主要看类如何override   这个函数和如何重载运算符

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

作者: 侍小波    时间: 2012-9-25 18:29
equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等。
==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true
Eg:s1 = new String("sony"); //创建的是字符串对象
s1.equals("sony"); //返回
trues1 == "sony" //返回false
//如果
s1 = "sony";
s1 == "sony" //返回true


作者: yueguhua    时间: 2012-9-27 07:56
equals相当于 ==  经常用作对象和对象之间的比较
name.equals("admin")和  name=="admin"  一样




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2