c# 中的Equals()和==有什么区别?

这两个分别是比较什么的?请举个例子!

c#中 ==与equals有什么区别

对于值类型、引用类型来说比较过程怎样的?

using System;
using System.Collections.Generic;
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

因为值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
"==" : 操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
"equals" : 操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
而字符串是一个特殊的引用型类型,在C#语言中,重载了string 对象的很多方法方法(包括equals()方法),使string对象用起来就像是值类型一样。
因此在上面的例子中,第一对输出 ,字符串a和字符串b的两个比较是相等的。
对于 第二对输出 object g = a 和object h = b , 在内存中两个不同的对象,所以在栈中的内容是不相同的,故不相等。而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。

MSDN中就有介绍啊:
下面的规则概括了 Equals 方法和等号运算符 (==) 的实现准则:

每次实现 Equals 方法时都实现 GetHashCode 方法。这可以使 Equals 和 GetHashCode 保持同步。

每次实现相等运算符 (==) 时,都重写 Equals 方法,使它们执行同样的操作。这样,使用 Equals 方法的基础结构代码(如 Hashtable 和 ArrayList)的行为就与用相等运算符编写的用户代码相同。

每次实现 IComparable 时都要重写 Equals 方法。

实现 IComparable 时,应考虑实现相等 (==)、不相等 (!=)、小于 ( <) 和大于 (>) 运算符的运算符重载。

不要在 Equals、GetHashCode 方法或相等运算符 (==) 中引发异常。

有关 Equals 方法的相关信息,请参见实现 Equals 方法。

在值类型中实现相等运算符 (==)
大多数编程语言中都没有用于值类型的默认相等运算符 (==) 实现。因此,只要相等有意义就应该重载相等运算符 (==)。

应考虑在值类型中实现 Equals 方法,这是因为 System..::.ValueType 的默认实现和自定义实现都不会执行。

每次重写 Equals 方法时都实现相等运算符 (==)。

在引用类型中实现相等运算符 (==)
大多数语言确实为引用类型提供默认的相等运算符 (==) 实现。因此,在引用类型中实现相等运算符 (==) 时应小心。大多数引用类型(即使是实现 Equals 方法的引用类型)都不应重写相等运算符 (==)。

如果类型是 Point、String、BigNumber 等基类型,则应重写相等运算符 (==)。每当考虑重载加法 (+) 和减法 (-) 运算符时,也应该考虑重载相等运算符 (==)。

好了,下面是考题,相信答案大家都知道了。

Console.WriteLine((2 + 2) == 4);
object s = 1;
object t = 1;
Console.WriteLine(s == t);

string a = "hello";
string b = String.Copy(a);
string c = "hello";

Console.WriteLine(a == b);
Console.WriteLine((object)a == (object)b);
Console.WriteLine((object)a == (object)c);

答案:TRUE, FALSE, TRUE, FALSE, TRUE
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-01-03
EQUEALS()用于比较两个对象的内容是否一致。

==用于判断两个变量是否是同一个对象的引用。
第2个回答  2010-01-04
Equals要判断两者引用类型是否一== 是判断值是否一致
第3个回答  2010-01-03
操作符“==”在值类型情况下表示是否值相等.
equals 判断是否是同一个对象的引用.
string的==和equals都是比较值。
static void Main(string[] args)
{
StringBuilder c = new StringBuilder("AAA");
StringBuilder d = new StringBuilder("AAA");
Console.WriteLine(c==d); //false
Console.WriteLine(c.Equals(d));//true
}
第4个回答  2010-01-03
equals()比较字符串类型
==比较int、double等类型

c# 中的Equals()和==有什么区别?
"equals" : 操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。而字符串是一个特殊的引用型类型,在C#语言中,重载了string 对象的很多方法方法(包括equals()方法),使string对象用起来就像是值类型一样。因此在上面的例子中,第一对输出 ,字符串a和字符串b的两个比较是相等的。...

C#值类型,引用类型中的Equals和==的区别浅析
== 和 Equals 的区别 1. == 是一个运算符。2.Equals则是string对象的方法,可以.(点)出来。我们比较无非就是这两种 1、基本数据类型比较 2、引用对象比较 1、基本数据类型比较 ==和Equals都比较两个值是否相等。相等为true 否则为false;2、引用对象比较 ==和Equals都是比较栈内存中的地址是否...

c#equals 和==的区别
C#中的相等有两种类型:引用相等(ReferenceEquals)和值相等(Equals)。值相等就是说两个对象包含相同的值。而引用相等则比较的是两个对象的引用是否是同一个对象。也就是说,如果ReferenceEquals为True,则Equals必然为True,反过来就不一定了。这样的话可以看出来,ReferenceEquals我们没有比较去管他什么,系统...

c#中比较字符串用「equals」还是「==」?
在C#中,比较字符串时推荐使用'=='而非'string.Equals'。原因有以下几点。.NET设计中,字符串类型兼备引用类型和值类型特性,不存在引用或值的差异判断问题。考虑到封闭类型不可重写,'=='和'string.Equals'在.NET环境下表现一致,不存在不一致的情况。误解可能源自对Java的过度依赖。.NET的设计初衷是...

请教C#:Equals()和==的区别
这个问题比较复杂。你需要先了解==,Equals,ReferenceEquals三者的区别和三者在处理值类型和引用类型上的具体表现。这里只解释一下你的代码的运行结果:首先要说明,object作为所有类型的父类,它强制转换其他类型为object类型时并不会将类型实际转换完后单独分配一块内存空间进行存储,它只是一个引用而已。

c#中=与==的区别
=是赋值,==是比较的两个引用是否相等,二者没有共同点,倒是==和equals方法有区别 。对于预定义的值类型,如果操作数的值相等,则相等运算符 (==) 返回真,否则,返回假。对于除 string 类型以外的引用类型,如果两个操作数引用相同的对象,则 == 返回真。对于 string ...

c#中equals和==的奇怪问题?
简而言之,`equals`和`==`在C#中的行为取决于它们所操作的对象类型。数值类型通常通过重写`Equals`方法来比较其值,而引用类型则通过`ReferenceEquals`方法比较对象引用。理解这些细节有助于避免在使用C#时出现混淆,特别是在处理值类型和引用类型时。值类型在使用`==`进行比较时,实际上会进行装箱操作,...

C#中“相等”、“相同”、“相关”都各有什么不同?
相等一般是指值是否相等如果是值类型用"=="作比较,若是引用类型则用equals()比较 相同可能是指同个对象是否指向同一内存地址。

...和equals的区别 java c#==和equals的区别 c equals和 的区...
==是比较简单对象,如int等 String及非简单对象,要使用equals 比较 ~

C#中为什么克隆出来的对象用equals方法比较返回false
比较的2种方式:== 比较是比较2者的值 Equals 比较的是2者的地址是否相同.克隆出来的对象是值相同.但是地址是不一样的.所以Equals返回false.

相似回答