C#中的 == 和equals()差別淺析。本站提示廣大學習愛好者:(C#中的 == 和equals()差別淺析)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中的 == 和equals()差別淺析正文
起首看看,如以下代碼:
int age = 25; short newAge = 25; Console.WriteLine(age == newAge); //true Console.WriteLine(newAge.Equals(age)); //false Console.ReadLine();
int和short為原始類型,但與“==”比擬前往true,equals()比擬前往false。為何呢?
簡而言之:“equals()”比擬“= =”龐雜。
詳細來講:
原始類型籠罩(override)基類的object.Equals(object),而且當括弧中的object與其類型和值雷同時前往true (留意Nullable類型也合適上述斷定;非空Nullable類型老是裝箱到一個基本類型實例)。
因為newAge是short,是以在object是short且值與newAge值相等時,newAge.Equals(object)前往true。你傳遞的是一個int對象,所以它前往false。
比擬之下,“= =”運算符被界說為帶兩個整形(int)或兩個短整型(short)或兩個長整形(long)的運算。當“= =”兩個參數一個是整形和一個短整型時,編譯器會隱式轉換short為int,並比擬轉換後int值年夜小。
使其任務其他辦法:
原始類型也有本身的equals()辦法,equals接收雷同的類型的參數。
假如你寫age.Equals(newAge),編譯器將選擇int.Equals(int)作為最好的重載(overload)辦法且隱式轉換short為int。然後,它會前往true,由於這類辦法直接比擬兩個int值年夜小。
short也有一個short.Equals(short)辦法,然則int類型不克不及隱式轉換為short,所以就不會挪用它。
你可使用cast轉換強迫挪用這個辦法:
Console.Writeline(newAge.Equals((short)age)); //true
這將直接挪用short.Equals(short),沒有裝箱操作。假如age年夜於32767,它會拋出一個溢出異常。
你也可挪用short.Equals(object)這個重載,但須要明白地傳遞一個經由裝箱的具有雷同類型的對象:
Console.WriteLine(newAge.Equals((object)(short)age)); // true
像後面可選辦法(short.Equals(short))一樣,假如年夜小跨越short規模,異樣拋出一個溢出異常。分歧於以往的處理計劃,它將short裝箱成一個object——糟蹋time和memory。
這裡是現實中應用的Equals():
public override bool Equals(Object obj) { if (!(obj is Int16)) { return false; } return m_value == ((Int16)obj).m_value; } public bool Equals(Int16 obj) { return m_value == obj; }
經由過程這篇文章年夜家是否是對C#中的 == 和equals()的差別有所懂得了,願望這篇文章對年夜家的進修有所贊助。