初時相等性判斷

2021-06-16 23:49:56 字數 2803 閱讀 1757

1.      概述

c#中有四種方式用來進行相等性判斷,如下:

object.equals(object value,object value2):會呼叫第乙個引數的例項equals方法,永遠不要重寫他。

object的virtualinstance  equals方法:預設比較兩個物件的位址,由於這是個虛方法,所以重寫他以實現物件的內容比較,典型的是string的例項equals方法。

equals

方法,就要重寫他,譬如

string

重寫了例項

equals

方法,也同時重寫了

==。所以對於string來說,呼叫object.equlas和例項equals和==是乙個效果的。後面會有乙個people的例子。

在平時最常使用的就是例項equals方法,因此後面的重點要將著重關注他。

2.      引用判斷

如何判斷兩個物件的位址相等呢,我們可以使用object.referenceequals(object value1,object value2)。只有當兩個物件的位址相同時,這個方法才會返回true。你會發現,這個方法的引數是object,所以使用它來判斷兩個值型別是否相等,會產生裝箱,這就意味著,使用referenceequals來判斷兩個值型別永遠返回false,有興趣的可以試一試。

關於referenceequals需要的一點就是,使用它判斷兩個常量字串時,出現的問題。請看如下**:

class program

}

這段**會輸出true。實際上這涉及到了字串留用技術,源**中所有出現的字串常量,都會進行留用,也就是說,兩個相同的常量只會在記憶體中保留乙份,所以上述**中,obj和obj2指向的是同乙個物件,因此使用referenceequals來判斷會返回true。

如果我們將上述**修改如下:

class program

}

然後我們分別輸入「string」,「string「,這次結果就是false。原因很簡單,在堆中建立了兩個物件,這兩個物件的內容都是「string」,但是位址卻不同,所以使用referenceobject返回false。

3.      內容判斷

對於object.equals(objectobj1,object object2)這個靜態方法,他會在內部呼叫第乙個引數的例項equals方法,內部實現如下:

所以,如果你使用object.equals方法來進行相等性判斷,那麼最終會呼叫引數的例項equale方法。

class program

}

上面的**中,我們使用object.equals來判斷相等性,事實上,由於object.equals方法會在內部直接呼叫引數1的equals例項方法,所以,object.equals(str1,str2)和str1.equals(str2)是一樣的。

現在我們在修改一下**,如下:

objectobj1 = "string";

objectobj2 = "wang";

console.writeline(object.equals(obj1, obj2));//

等價於obj1.equals(obj2)

這裡,我們只是將變數obj1和obj2修改為了object型別,但是,這段**和上面的那段是沒有任何區別的,由於object。equals(obj1,obj2)等同於obj1.equals(obj2),又由於equals是個例項且虛方法,所以最終會呼叫到字串的equals例項方法。

我們知道,字串的例項equals方法是比較特殊的,因為他重新了從基類繼承而來的equals方法,他比較的不再是位址,而是物件的記憶體。所以,上面**實際判斷的是兩個字串的內容是否相等。乙個是string,乙個是wang,結果肯定為false、

class program

}class people

}

object.equals(std1,std2),同樣相當於std1.equals(std2),所以最終會呼叫people的例項equals方法。

由於我們沒有重寫(override)equals方法,所以使用的就是預設的實現,比較的是兩個位址是否相等。毫無疑問,std1和std2是兩個不同的物件,所以位址肯定不同,結果為false。

我們可以重寫equals方法,來比較身份證是否相等,如下:

class people

public override bool equals(object obj)

public static bool operator==(peopleobj1,people obj2)

public static bool operator!=(peopleobj1,people obj2)

}

這裡我們遵循一開始將的原則

:重寫了例項

equals

方法,也要同時重寫

==過載。所以這裡使用

object.equals(std1,std2)

和std1.equals

(std2

)和std1==std2

是乙個效果的。這和字串是一樣的

現在,使用object.equals(std1,std2))最終就會呼叫到people的那個重寫的equals方法,所以最終比較的是兩個人的身份證是否相同(物件的內容),而std1和std2的id都是1,所以結果為true。

3.==操作符過載

這個==和object.referenceequals是一模一樣的,比較的都是兩個物件的位址。此處不多數。

C 中相等性判斷

我們在想對乙個可列舉的物件集合進行去重操作時,一般第乙個想到的就是就是linq的distinct方法。先定義乙個類,然後使用distinct方法去重。class man public string name public string adress public decimal weight pub...

js中相等性判斷探索

最近發現乙個比較神奇的問題如下 false true true true 一臉懵逼中。那麼,現在就來從開始探索一下這道題的原理 js比較操作 js提供了三中不同的比較操作,分別是 嚴格相等 triple equals 或 identity 使用 寬鬆相等 double equals 使用 es6新出...

物件相等判斷

object 型別中於相等有關的方法 public virtual bool equals object obj public static bool referenceequals object obja,object objb public static bool equals object o...