標籤:new 靜態 強制轉換 返回 lib 三十九 重要 最大的 csdn
比較對象的相等性
需要理解對象相等的機制對邏輯運算式的編程很重要,另外,對實現運算子多載和類型強制轉換也很重要.
對象相等的機制有所不同,這取決於比較的是參考型別還是實值型別.
比較參考型別的相等性
System.Object定義了三個不同的方法來比較對象的相等性:ReferenceEquals()和Equals()兩個版本,再加上比較子,實際上有四種進行相等比較的方式.
1.ReferenceEquals()方法
以下是ReferenceEquals()方法的定義
public static bool ReferenceEquals(object objA, object objB)
ReferenceEquals()是一個靜態方法,測試兩個引用是夠引用類的同一個執行個體,特別是兩個引用是否包含記憶體中的相同地址.作為靜態方法,他不能重寫,所以System.Object的實現代碼保持不變.如果提供的兩個引用引用同一個對象執行個體,則ReferenceEquals()總是返回true;否則就返回false.但是它預設 null等於null;
案例:
SomeClass x,y;
x=new SomeClass();
y=SomeClass();
bool b1=ReferenceEquals(null,null) //返回真
bool b2=ReferenceEquals(null,x) //返回假
bool b3=ReferenceEquals(x,y) //返回假,因為x和y指向不同的對象
2.虛擬Equals()方法
以下是Equals()方法的定義:
public virtual bool Equals(object obj)
返回一個值,該值指示當前的object是否等於當前的object.
Equals的預設實現僅支援引用相等,但衍生類別可重寫此方法一直吃值相等.
在下面的列表中,x,y,z表示不為空白的引用:
(1)除設計浮點型的情況外,x.Equals(x)都返回true
(2)x.Equals(y)返回與y.Equals(x)相同的值
(3)如果x和y都為NaN,則x.Equals(y)返回true.
(4)若且唯若x.Equals(z)返回true時,(x.Equals(y)&&y.Equals(z))才返回相同的值
(5)只要不修改x和y引用的對象,對x.Equals(y)的相機調用將返回相同的值
(6)x.Equals(null)返回false
案例:
public class Sample
{
public void Method()
{
object obj1 = new object();
object obj2 = new object();
Console.WriteLine(obj1.Equals(obj2));//返回假
obj2 = obj1;
Console.WriteLine(obj1.Equals(obj2));//返回真
Console.ReadKey();
}
}
3.靜態Equals()方法
以下是靜態Equals()方法的定義
public static bool Equals(object objA , object objB)
如果objA是與objB相同的執行個體,或者如果兩者均為空白引用,或者如果objA.Equals(objB)返回true,則為true ,否則為false.
實值型別的相等比較
在進行實值型別的相等比較的時,採用與參考型別相同的規則:ReferenceEquals()用於比較引用,Equals()用於比較值.最大的區別是,實值型別需要裝箱才能把他們轉換為引用,才能對他們執行方法.
ReferenceEquals()在應用實值型別時,總是返回false,因為為了調用這個方法,實值型別需要裝箱到對象中.即使使用下面的代碼:
int v = 10;
bool b = ReferenceEquals(v, v);
Console.WriteLine(b);//b返回false
因為在轉換每個參數時,v都睡被單獨裝箱.
C#編程(三十九)----------比較對象的相等性