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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# 相等运算

發布時間:2025/7/14 C# 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 相等运算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.?public static bool ReferenceEquals(object left, object right)

Object.ReferenceEquals()在兩個變量引用到同一個對象時返回true,也就是兩個變量具有相同的對象ID。不管比較的類型是引用類型還是值類型的,這個方法總是檢測對象ID,而不是對象內容。

string a = "test"; string b = "test"; if (Object.ReferenceEquals(a, b)) {Console.WriteLine("equal"); } else {Console.WriteLine("not equal"); } //equal

當比對兩個值類型的時候,Object.ReferenceEquals返回false,即使比較的是同一個值類型對象,也會返回false,因為Object.ReferenceEquals輸入的兩個參數是object類型,所以需要對兩個值類型的參數進行裝箱操作,導致兩個對象的ID不同。

int i = 5; int j = 5; if (Object.ReferenceEquals(i, j)) {Console.WriteLine("equal"); } else {Console.WriteLine("not equal"); } //not equalif (Object.ReferenceEquals(i, i)) {Console.WriteLine("ReferenceEquals : equal"); } else {Console.WriteLine("ReferenceEquals : not equal"); } //not equal

2.public virtual bool Equals(object right)

Object.Equals()方法使用對象的ID來斷定兩個變量是否相等。這個默認的Object.Equals()函數的行為與Object.ReferenceEquals()是一樣的。但是請注意,值類型是不一樣的。System.ValueType并沒有重載Object.Equals(),記住,System.ValueType是所有你所創建的值類型(使用關鍵字struct創建)的基類。兩個值類型的變量相等的前提條件是它們的類型和內容都是一樣的。ValueType.Equals()實現了這一行為。不幸的是,ValueType.Equals()并不是一個高效的實現。ValueType.Equals()是所有值類型的基類(譯注:這里是說這個方法在基類上進行比較)。為了提供正確的行為,它必須比較派生類的所有成員變量,而且是在不知道派生類的類型的情況下。在C#里,這就意味著要使用反射。對反射而言它們有太多的不利之處,特別是在以性能為目標的時候。

當你想改變引用類型默認的Equals()語義試,建議重載Equ()方法。

你必須確保你重新定義的方法能滿足數學相等性質:相等的自反性,對稱性和傳遞性。自反性就是說一個對象是等于它自己的,不管對于什么類型,a==a總應該返回true;對稱就是說,如果有a==b為真,那么b==a也必須為真;傳遞性就是說,如果a==b為真,且b==c也為真,那么a==c也必須為真,這就是傳遞性。

標準模式:

public class Foo {public override bool Equals(object right){// check null:// the this pointer is never null in C# methods.if (right == null)return false;if (object.ReferenceEquals(this, right))return true;// Discussed below.if (this.GetType() != right.GetType())return false;// Compare this type's contents here:return CompareFooMembers(this, right as Foo);}private static bool CompareFooMembers(Foo f, Foo b){//do } }

3.== 操作符

?任何時候你創建一個值類型,重新定義操作符==()。原因和實例的Equals()是完全一樣的。默認的版本使用的是引用的比較來比較兩個值類型。

4.public static bool Equals(object left, object right);

靜態的Object.Equals()方法是像下面這樣實現的:

public static bool Equals(object left, object right) {// Check object identityif (left == right)return true;// both null references handled aboveif ((left == null) || (right == null))return false;return left.Equals (right); }

靜態的Equals()是使用左邊參數實例的Equals()方法來斷定兩個對象是否相等。

?

總結

你應該為了更好的性能而總是為值類型實例提供重載的Equals()方法和操作符==()。當你希望引用類型的相等與對象ID的相等不同時,你應該重載引用類型實例的Equals()。

?

轉載于:https://www.cnblogs.com/xanadu123/p/5034405.html

總結

以上是生活随笔為你收集整理的C# 相等运算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。