c# equals与==的区别

c# equals与==的区别c# equals与==的区别Posted on 2008-04-11 09:17  飞得更高  阅读(15147)  评论(23)  编辑  收藏对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false。对于string 以外的引用类型,如果两个对象引用同一个对象,则 == 返回 true。对于 string 类型,== 比较字符串的值。==操作比较的是两个变量的值是否相等。equals()方法比较的是两个对象的内容是否一致.equals也就是比较引用类型是否是对同一个对象的引用。对于值类型的比较,这里就不做描述了,下面讨论引用类型的比较:首先我们看一段程序

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;

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

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。为什么会出现这个答案呢?因为值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。而字符串是一个特殊的引用型类型,在C#语言中,重载了string 对象的很多方法方法(包括equals()方法),使string对象用起来就像是值类型一样。因此在上面的例子中,字符串a和字符串b的两个比较是相等的。对于object g 和object h 时内存中两个不同的对象,所以在栈中的内容是不相同的,故不相等。而g.equals(h)用的是sting的equals()方法故相等(多太)。如果将字符串a和b作这样的修改:string a="aa";string b="aa";则,g和h的两个比较都是相等的。这是因为系统并没有给字符串b分配内存,只是将"aa"指向了b。所以a和b指向的是同一个字符串(字符串在这种赋值的情况下做了内存的优化)。对于p1和p2,也是内存中两个不同的对象,所以在内存中的地址肯定不相同,故p1==p2会返回false,又因为p1和p2又是对不同对象的引用,所以p1.equals(p2)将返回false。对于p3和p4,p4=p3,p3将对对象的引用赋给了p4,p3和p4是对同一个对象的引用,所以两个比较都返回true。如果我们对person的equals方法重写:

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;

}

public override bool Equals(object obj)

{

if (!(obj is Person))

return false;

Person per = (Person)obj;

return this.Name == per.Name;

}

}

}那么p1.equals(p2),就会返回true。

(0)

相关推荐

  • java中String str=""与new String()的区别

    常量池: 常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据.它包括了关于类.方法.接口等中的常量,也包括字符串常量. 在常量池中存储字符串常量的 ...

  • 还傻傻分不清楚equals和==的区别吗?看完就明白了

    解决一个问题的最好方法就是发现一个问题产生的根源,即发现最本质的东西,再去解决它. Java语言里面的equals()方法是交给开发者们自己去覆盖重写编写功能的,即让开发者去定义当满足什么条件时,两个 ...

  • C#基础,Equals()和==的区别?

    C#基础,Equals()和==的区别? C#的==运算符与Equals()方法. 现在就说下两者的区别: 1.==在比对值类型时,如果二者值相等,则返回true,否则返回false. 2.==在比对 ...

  • hashCode和equals的区别

    有面试官会问:你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?equals和hashCode都是Object对象中的非final方法,它们设计的 ...

  • hashCode与equals的区别与联系

    引用....http://blog.csdn.net/afgasdg/article/details/6889383#一.equals方法的作用1.默认情况(没有覆盖equals方法)下equals方 ...

  • java中equals,hashcode和==的区别

    java中equals,hashcode和==的区别 1.== java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型 byte,short,char,int,long,float,d ...

  • 田哥:面试被问== 与equals 的区别,该怎么回答?

    最近有位小伙伴去一家互联网公司面试,结果被问:"你是如何理解==与equals的?"他支支吾吾半天没回答到重点.结果可想而知了~~~ 这道题在笔试中的出镜率相当高,其实很简单. = ...

  • 儒、释、道三家文化的七大区别

    闲云谷 峰下闲云云上松,珍兰奇蕙伴节丛:不忍移爱进瓦罐,卷书抱坛迁谷中. 994篇原创内容 公众号 一.文化主旨 儒家文化--积极进取的文化 儒家倡导知识的获取和品德的培养,是一种积极向上的文化. 道 ...

  • 招摇撞骗罪和诈骗罪有什么区别

    招摇撞骗罪和诈骗罪都表现为欺骗行为,招摇撞骗罪也可以像诈骗罪一样骗取财物,两者容易混淆,大家知道招摇撞骗罪和诈骗罪有什么区别吗? 律师解答: 招摇撞骗罪侵犯的客体主要是国家机关的威信及其正常活动,而诈 ...

  • 香港服务器托管和租用有什么区别?

    香港服务器托管和租用有什么区别?托管和租用都是服务器选择使用方式,想要知道香港服务器托管和租用两种方式有什么区别以及哪种方式比较好,就需要深入了解它们,下面我们就聊聊香港服务器托管和租用的区别. 什么 ...