天天看點

C#中equals和==的差別有哪些

本文導讀:C# 中==是用來判斷變量的值是否相等,相等傳回true,不相等傳回false。Equals是用來判斷兩個對象(除string類型外)是否相等,相等的 條件是:值,位址,引用全相等,因為String類重寫了Equals方法,是以當string類型的對象用Equals方法比較時隻比較兩個對象的值相 等傳回true,不相等傳回false。

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
{
privatestring name;
publicstring Name
{
get{ return name; }
set{ name = value; }
         }
public Person(string name)
{
this.name = name;
         }
     }
class program
{
staticvoid Main(string[] args)
{
string a =newstring(newchar[] ...);
string b =newstring(newchar[] { '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();
         }
     }
 }      

轉載于:https://www.cnblogs.com/hoosway/p/3600709.html

c#