C 相等比較

2021-06-26 07:44:47 字數 2102 閱讀 6105

c#中的物件都繼承自system.object物件,分為引用型別和值型別兩種,所以物件的相等比較而言就分兩種,一種是比較引用,一種是比較值。system.object預設提供了三個方法來進行物件的相等比較:靜態的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

2、 equals()虛擬版本

system.object實現**也比較引用。但因為這個方法是虛擬的,所以可以在自己的類中重寫它,按值來比較物件。特別是如果希望類的例項用作字典中的鍵,就需要重寫這個方法,以比較值。否則,根據重寫object.gethashcode()的方式,包含物件的字典類要麼不工作,要麼工作的效率非常低。在重寫equals()方法時要注意,重寫的**不會丟擲異常。這是因為如果丟擲異常,字典類就會出問題,一些在內部呼叫這個方法的.net基類也可能出問題。

3、靜態的equals()方法

equals()的靜態版本與其虛擬例項版本的作用相同,其區別是靜態版本帶有兩個引數,並對它們進行相等比較。這個方法可以處理兩個物件中有乙個是null的情況,因此,如果乙個物件可能是null,這個方法就可以丟擲異常,提供了額外的保護。靜態過載版本首先要檢查它傳送的引用是否為null。如果它們都是null,就返回true(因為null與null相等)。如果只有乙個引用是null,就返回false。

如果兩個引用都指向某個物件,它就呼叫equals()的虛擬例項版本。這表示在重寫equals()的例項版本時,其效果相當於也重寫了靜態版本。

4、「==」比較運算子

在預設情況下,==運算子對引用型別比較的是兩個物件指向的引用是否是同乙個物件,但是作為乙個自定義的複雜類,可以自己重寫適合自己的「==」運算子,在重寫「==」時必須同時重寫「!=」運算子。

特殊注意的是:在重寫相等比較時,要小心可能的迴圈呼叫問題

public

class

list

private

set 

} public

intcapacity

set

} }

public

event

eventhandler

changed;

public

list(

intcapacity=defaultcapacity)

public

tthis

[ int

index]

set

}  

public

void

add(t item)

protected

virtual

void

onchanged()

public

override

bool

equals(

object

other)

public

override

intgethashcode()

static

bool

equals(

list

a,list

b)

} return

true

; }

public

static

bool

operator

==(list

a,list

b)

public

static

bool

operator

!=(list

a,list

b)

}

C 之相等比較(常規比較)

c 之相等比較 c 中的物件都繼承自system.object物件,分為引用型別和值型別兩種,所以物件的相等比較而言就分兩種,一種是比較引用,一種是比較值。system.object預設提供了三個方法來進行物件的相等比較 靜態的referenceequals 和equals 的兩個版本,加上 運算子...

物件相等比較

對於string型別而言,一般用 或者equales做相等比較,前者比較字串的引用,後者比較字串的值。字串常量的值儲存於常量池中,只要值相同,那麼引用的就是同乙個字串常量,也就是說,和equals效果一樣。字串物件儲存於堆中,不同的物件在堆上的記憶體位址是不一樣的。因此,建立兩個值相等的string...

字串相等比較

如果說現在要是有兩個int型的變數判斷其相等可以使用 完成。範例 觀察基本資料型別比較 public class string demo 結果 ture 那麼如果說現在在string類的物件上使用了 呢?範例 觀察string直接使用 比較 public class string demo fals...