日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#比較对象的相等性

發(fā)布時間:2023/12/9 C# 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#比較对象的相等性 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
? ?對于相等的機(jī)制全部不同,這取決于比較的是引用類型還是值類型。以下分別介紹引用類型和值類型的相等性。

1.比較引用類型的相等性

? ?System.Object定義了三種不同的方法,來比較對象的相等性:ReferenceEquals()和兩個版本號的Equals()。再加上比較運算符(==)。實際上有4種進(jìn)行比較相等的方式。

1.1 ReferenceEquals()方法

命名控件: System

程序集:mscorlib.dll

語法:public static bool ReferenceEquals(Object objA, Object objB)

能夠看出ReferenceEquals()是一個靜態(tài)方法,確定指定的Object實例是否是同樣的實例。作為靜態(tài)方法。所以不能重寫。

1.1.1 使用ReferenceEquals()方法比較值類型

int int1 = 3;

bool B1 = Object.ReferenceEquals(int1, int1);//B1為false

? ? 因為objA和objB是值類型,首先進(jìn)行裝箱。然后傳遞給ReferenceEquals()方法。這意味著,即使objA和objB表示值類型的同一個實例,ReferenceEquals()方法也返回false。

1.1.2 使用ReferenceEquals()方法比較字符串

String s1 = "String1";

String s2 = "String1";

bool B2 = Object.ReferenceEquals(s1, s2);//true

String suffix = "A";

String s3 = "String" + suffix;

String s4 = "String" + suffix;

bool B3 = Object.ReferenceEquals(s3, s4);//false

? ? 當(dāng)比較字符串時 假設(shè) objA 和 objB 是字符串,假設(shè)該字符串會暫留,ReferenceEquals 方法返回 true。 它不運行值相等測試。

在以下的演示樣例中。由于它們是一個暫存的字符串的兩個實例,s1 和 s2 相等。 可是,s3 和 s4 不相等,由于雖然它們是具有同樣的字符串值。字符串不會暫留。

1.1.3 使用ReferenceEquals()比較兩個對象

object o = null;

object p = null;

object q = new Object();

bool B4 = Object.ReferenceEquals(o, p);//true

p = q;

bool B5 = Object.ReferenceEquals(p, q);//true

bool B6 = Object.ReferenceEquals(o, p);//false

1.2 Equals()方法

1.2.1 虛擬的Equals()方法

命名空間: System

程序集:mscorlib(在mscorlib.dll中)

語法:public virtual bool Equals(Object obj)

? ? Equals()虛擬版本號的System.Object實現(xiàn)代碼也比較引用。

但由于這種方法是虛擬的。所以能夠在自己的類中重寫它。按值來比較對象。

特別是假設(shè)希望類的實例用作字典中的鍵,就須要重寫這種方法,以比較值。否則。依據(jù)重寫Object.GetHashCode()的方式。包括對象的字典類要么不工作,要么工作的效率很低。在重寫Equals()方法時要注意,重寫的代碼不會拋出異常。這是由于假設(shè)拋出異常。字典類就會出問題,一些在內(nèi)部調(diào)用這種方法的.NET基類也可能出問題。

? ? Equals 是一個虛方法。同意不論什么類重寫事實上現(xiàn)。

表示某個值(本質(zhì)上能夠是不論什么值類型)或一組值(如復(fù)數(shù)類)的不論什么類都應(yīng)該重寫 Equals。假設(shè)類型要實現(xiàn) IComparable,則它應(yīng)該重寫 Equals。

Equals 的新實現(xiàn)應(yīng)該遵循 Equals 的全部保證:

x.Equals(x) 返回 true。

x.Equals(y) 與 y.Equals(x) 返回同樣的值。

假設(shè) (x.Equals(y) && y.Equals(z)) 返回 true,則 x.Equals(z) 返回 true。

僅僅要不改動 x 和 y 所引用的對象,x.Equals(y) 的興許調(diào)用就返回同樣的值。

x.Equals(null) 返回 false。

? ? Equals 的新實現(xiàn)不應(yīng)該引發(fā)異常。建議重寫 Equals 的不論什么類同一時候也重寫 System.Object.GetHashCode。

除了實現(xiàn) Equals(對象)外。還建議全部的類為自己的類型實現(xiàn) Equals(類型)以增強(qiáng)性能。

比如:

class TwoDPoint : System.Object

{

public readonly int x, y;

public TwoDPoint(int x, int y) //constructor

{

this.x = x;

this.y = y;

}

public override bool Equals(System.Object obj)

{

// If parameter is null return false.

if (obj == null)

{

return false;

}

// If parameter cannot be cast to Point return false.

TwoDPoint p = obj as TwoDPoint;

if ((System.Object)p == null)

{

return false;

}

// Return true if the fields match:

return (x == p.x) && (y == p.y);

}

public bool Equals(TwoDPoint p)

{

// If parameter is null return false:

if ((object)p == null)

{

return false;

}

// Return true if the fields match:

return (x == p.x) && (y == p.y);

}

public override int GetHashCode()

{

return x ^ y;

}

}

1.2.2 靜態(tài)的Equals()方法

命名空間: System

程序集:mscorlib(在mscorlib.dll中)

語法:public static bool Equals(Object objA, Object objB)

Dog m1 = new Dog("Alaskan Malamute");

Dog m2 = new Dog("Alaskan Malamute");

Dog g1 = new Dog("Great Pyrenees");

Dog g2 = g1;

Dog d1 = new Dog("Dalmation");

Dog n1 = null;

Dog n2 = null;

Console.WriteLine("null = null: {0}", Object.Equals(n1, n2));//true

Console.WriteLine("null Reference Equals null: {0}\n", Object.ReferenceEquals(n1, n2));//true

Console.WriteLine("{0} = {1}: {2}", g1, g2, Object.Equals(g1, g2));//true

Console.WriteLine("{0} Reference Equals {1}: {2}\n", g1, g2, Object.ReferenceEquals(g1, g2));//true

Console.WriteLine("{0} = {1}: {2}", m1, m2, Object.Equals(m1, m2));//true

Console.WriteLine("{0} Reference Equals {1}: {2}\n", m1, m2, Object.ReferenceEquals(m1, m2));//false

Console.WriteLine("{0} = {1}: {2}", m1, d1, Object.Equals(m1, d1)); //false Console.WriteLine("{0} Reference Equals {1}: {2}", m1, d1, Object.ReferenceEquals(m1, d1)); //false?

? ? 靜態(tài) Equals(Object, Object) 方法指示兩個對象。objA 和 objB,是否相等

? ? 它確定兩個對象是否表示同一對象引用。 假設(shè)成功,該方法返回 true. 這測試與調(diào)用 ReferenceEquals 方法等效。 另外。假設(shè) objA 和 objB 都為 null,則方法返回 true。

它確定 objA 或 objB 是否 null。 假設(shè)是這樣。則返回 false。

? ? 假設(shè)兩個對象不表示同一對象引用,且均不為 null,它調(diào)用 objA。

Equals(objB) 而且返回結(jié)果。

這意味著。假設(shè) objA 重寫 Object.Equals(Object) 方法,該重寫調(diào)用。

1.3 比較運算符(==)

? ? 對于引用類型,== 默認(rèn)的行為與ReferenceEquals的行為同樣,僅有兩個對象指向同一個Reference的時候才返回true。可是.NET Framework中的類非常多對==進(jìn)行了重載,比如String類的==與Equals的行為同樣。推斷兩個字符串的內(nèi)容是否相等。所以在應(yīng)用中。對于 系統(tǒng)定義的引用類型建議不要使用==操作符,以免程序出現(xiàn)與預(yù)期不同的執(zhí)行結(jié)果。

重載的運算符 == 實現(xiàn)不應(yīng)引發(fā)異常。重載運算符 == 的不論什么類型還應(yīng)重載運算符 !=。

比如:

public static bool operator ==(ThreeDPoint a, ThreeDPoint b)

{

// If both are null, or both are same instance, return true.

if (System.Object.ReferenceEquals(a, b))

{

return true;

}

// If one is null, but not both, return false.

if (((object)a == null) || ((object)b == null))

{

return false;

}

// Return true if the fields match:

return a.x == b.x && a.y == b.y && a.z == b.z;

}

public static bool operator !=(ThreeDPoint a, ThreeDPoint b)

{

return !(a == b);

}

2.比較值類型的相等性

? ? 在比較值類型的相等時,採用與引用類型同樣的規(guī)則:ReferenceEquals()用于比較引用,Equals()用于比較值,比較運算發(fā)能夠看做是一個中間項。但最大的差別是值類型須要裝箱。才干把他們轉(zhuǎn)換為引用。

ReferenceEquals()在應(yīng)用于值類型時。總是返回false。

由于調(diào)用這種方法,須要裝箱。

總結(jié)

以上是生活随笔為你收集整理的C#比較对象的相等性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。