c#之相等比較
c#中的物件都繼承自system.object物件,分為引用型別和值型別兩種,所以物件的相等比較而言就分兩種,一種是比較引用,一種是比較值。system.object預設提供了三個方法來進行物件的相等比較:靜態的referenceequals()和equals()的兩個版本,加上「==」運算子共有四種來進行物件相等比較的方法。
相等比較的方法:靜態的referenceequals()、equals()靜態方法、equals()虛方法(子類可以去重寫)和「==」運算子。
相等比較分類:引用型別比較(類的例項)、值型別比較(基本資料型別,結構或者列舉的例項)。
但對於引用型別和值型別而言,同乙個方法它們的內部比較邏輯是不一樣的,下面進行下簡單的介紹。
一、引用型別相等比較
1、靜態的referenceequals()
referenceequals()是乙個靜態方法,比較兩個物件是否引用自同乙個位址,是則返回true,否則返回false
呼叫方法:referenceequals(obj1,obj2)
比較原則:1)、obj1和obj2同為null,則返回true
2)、obj1和obj2只有乙個為null,則返回false
3)、obj1和obj2均不為null時,比較兩個物件的引用位址,是則返回true,不是則返回false
例子:someclass x,y;
x = new someclass();
y = new someclass();
z = y;
boolean result1 = referenceequals(null,null); //return true
boolean result2 = referenceequals(null,x); //return false
boolean result3 = referenceequals(x,y); //return false
boolean result4 = referenceequals(y,z); //return true
2、虛擬的equals()方法
system.object()的虛擬的equals()方法也是比較引用的,但是因為它是虛擬的,所以繼承的子類可以重寫該方法以實現按值來比較物件,在重寫equals()方法時最好重寫物件的gethashcode()方法.
3、靜態的equals()方法
eauals()靜態方法的比較原則是按照引用的方式比較,再呼叫物件的equals()方法的例項版本進行比較,所以在重寫物件的equals()方法時,其實已經間接的重寫了靜態的equals()方法。
呼叫方法:equals(obj1,obj2)
比較原則:1)、obj1和obj2均為null,則返回true
2)、obj1和obj2中只有乙個為null,則返回false
3)、如果obj1和obj2兩個引用不指向同乙個物件,則返回false
4)、如果obj1和obj2兩個引用指向同乙個物件,則呼叫它們的equals()方法的例項版本進行比較
4、「==」比較運算子
在預設情況下,==運算子對引用型別比較的是兩個物件指向的引用是否是同乙個物件,但是作為乙個自定義的複雜類,可以自己重寫適合自己的「==」運算子,在重寫「==」時必須同時重寫「!=」運算子。
二、值型別相等比較
1、靜態的referenceequals()
referenceequals()方法用於比較引用,在比較之前,c#會先通過裝箱技術對每個值型別引數進行分別裝箱,這樣referenceequals()方法進行比較時得到的結果永遠時false,所以用referenceequals()來比較值型別是沒有什麼意義的。
2、虛擬的equals()方法、靜態的equals()方法和「==」運算子
對於值型別,這三個方法預設都是進行值比較的。
C 相等比較
c 中的物件都繼承自system.object物件,分為引用型別和值型別兩種,所以物件的相等比較而言就分兩種,一種是比較引用,一種是比較值。system.object預設提供了三個方法來進行物件的相等比較 靜態的referenceequals equals 靜態方法 equals 虛方法 子類可以去...
物件相等比較
對於string型別而言,一般用 或者equales做相等比較,前者比較字串的引用,後者比較字串的值。字串常量的值儲存於常量池中,只要值相同,那麼引用的就是同乙個字串常量,也就是說,和equals效果一樣。字串物件儲存於堆中,不同的物件在堆上的記憶體位址是不一樣的。因此,建立兩個值相等的string...
字串相等比較
如果說現在要是有兩個int型的變數判斷其相等可以使用 完成。範例 觀察基本資料型別比較 public class string demo 結果 ture 那麼如果說現在在string類的物件上使用了 呢?範例 觀察string直接使用 比較 public class string demo fals...