標(biāo)題:
C#中equals與==小記
[打印本頁(yè)]
作者:
51hei人人
時(shí)間:
2016-3-12 21:14
標(biāo)題:
C#中equals與==小記
序:
昨天技術(shù)群中的一個(gè)小伙伴發(fā)了幾個(gè)字符串以及值類型比較的面試題,沒想到我們的答案不盡人意。。。下面是截圖以及答案,看看與各位看官的答案是否相同。
0x00:
查看了幾篇前輩寫的博客后也有了自己的一些小總結(jié),如有錯(cuò)誤請(qǐng)大家指教出來(lái),不勝感激!下面是參考資料的傳送門。
http://new-fighter.iteye.com/blog/1634800
0x01:
眾所周知Java中的String有兩種聲明方式,1:String str1 = "abc";2:String str2 = new String("abc");這兩種存在很大的差異。這里不說(shuō),因?yàn)榇似闹鹘鞘荂#。而C#中的string作為引用類型只有一中方式,也就是上述的方式一。在此無(wú)論使用“==”還是“Equals”只要是string的字面量相同則比較結(jié)果就為ture。這個(gè)沒什么好說(shuō)的,下面說(shuō)一下非string的其他引用類型。
private class ObjectA
{
public string cName = "";
public int iAge = 0;
}
ObjectA oa1 = new ObjectA();
ObjectA oa2 = new ObjectA();
oa1.cName = "Clown";
oa1.iAge = 18;
oa2.cName = "Clown";
oa2.iAge = 18;
bool b01 = oa1.Equals(oa2);
bool b02 = oa1 == oa2;
object o1 = 1;
object o2 = 1;
bool b5 = (o1 == o2);
// false
bool b6 = (o1.Equals(o2));
// false
以上的代碼中聲明了一個(gè)ObjectA類,并在下方實(shí)例化了兩此此類,給此類的屬性賦予了相同的值,通過(guò)“==” 與“Equals”比較得到的結(jié)果均為false,由此可以推斷出除string外的引用類型兩者比較的都是引用地址。
0x02:
等等,先不要著急關(guān)閉瀏覽器 。引用類型中還有一個(gè)特殊的,那就是匿名類。所以上面的0x01中的總結(jié)是有BUG的。我們還是先看一下代碼,如下:
var a1 = new { name = "123", age = 12 };
var a2 = new { name = "123", age = 12 };
var a3 = new { age = 12, name = "123" };
int i1 = a1.GetHashCode(); // -1902033810
int i2 = a2.GetHashCode(); // -
1902033810
int i3 = a3.GetHashCode(); //
-843859346
bool b4 = a1.Equals(a2);
// true
bool b5 = a1.Equals(a3); // false
bool b6 = a1 == a2; // false
//bool b7 = (a1 == a3);
// 如果這面寫直接就會(huì)爆語(yǔ)法錯(cuò)誤的
上述中聲明了a1,a2,a3三個(gè)匿名,其中a1,a2屬性相同,值相同,屬性順序相同。而a3與兩者比較屬性相同,值相同,屬性屬性不相同。則得出的Hash值與兩者也有差異。
0x03:
以上實(shí)驗(yàn)結(jié)果可以粗略總結(jié)為:C#中string(引用類型)通過(guò)“==”與“Equals”比較都是對(duì)字面量進(jìn)行比較的,除去string與匿名類外的其他引用類型“==”與“Equals”比較的都是引用地址。而匿名類是通過(guò)“==”進(jìn)行值比較,“Equals”是對(duì)引用地址的比較。且還得出匿名類順序不同則AnonyType是不同的類型。
而序中提到的short.Equals(int)的比較是對(duì)我最為困惑的,現(xiàn)在可以根據(jù)以上結(jié)果分析,short.Equals中形參是Object類型,而引用類型通過(guò)“Equals”比較的是引用地址而非字面值。但int.Equals(int),形參為值類型的int,值類型存儲(chǔ)在棧上比較的是字面值。故返回true而前者返回false。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1