如以下**:12
3456
789int
age =
25
;
short newage =
25
;
console.writeline(age == newage);
//true
console.writeline(newage.equals(age));
//false
console.readline();
int和short為原始型別,但與「==」比較返回true,equals()比較返回false。為什麼呢?
answers:
簡而言之:
「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轉換強制呼叫這個方法:
1console.writeline(newage.equals((short)age));
//true
這將直接呼叫short.equals(short),沒有裝箱操作。如果age大於32767,它會丟擲乙個溢位異常。
你也可呼叫short.equals(object)這個過載,但需要明確地傳遞乙個經過裝箱的具有相同型別的物件:
1console.writeline(newage.equals((object)(short)age));
// true
像前面可選方法(short.equals(short))一樣,如果大小超過short範圍,同樣丟擲乙個溢位異常。不同於以往的解決方案,它將short裝箱成乙個object——浪費time和memory。
這裡是實際中使用的equals():12
3456
78910
1112
1314
1516
1718
19public
override
bool equals(
object
obj)
return
m_value == ((int16)obj).m_value;
}
public
bool equals(int16 obj)
和equals有什麼區別
分為兩種情況 1.比較的型別是基本資料型別時,只比較他們的值是否相等。2.比較型別為引用型別時,比較的是引用變數的記憶體位址是否相同。equals 1.對於普通物件來說,equals 函式原始碼就是實現 所以就是比較引用是否相同。基本型別沒有equals方法 2.對於string來說,就是比較值是否...
c 中 與equals有什麼區別
對於值型別 引用型別來說比較過程怎樣的?using system using system.collections.generic using system.text set public person string name class program string b new string ne...
c 與equals有什麼區別
對於值型別 引用型別來說比較過程怎樣的?using system using system.collections.generic using system.text set public person string name class program string b new string ne...