久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2312|回復: 0
收起左側

C#中equals與==小記

[復制鏈接]
ID:108531 發(fā)表于 2016-3-12 21:14 | 顯示全部樓層 |閱讀模式
     序:
        昨天技術群中的一個小伙伴發(fā)了幾個字符串以及值類型比較的面試題,沒想到我們的答案不盡人意。。。下面是截圖以及答案,看看與各位看官的答案是否相同。
        
        

        

        

   
    0x00:
        查看了幾篇前輩寫的博客后也有了自己的一些小總結,如有錯誤請大家指教出來,不勝感激!下面是參考資料的傳送門。
        http://new-fighter.iteye.com/blog/1634800
        
    0x01:
        眾所周知Java中的String有兩種聲明方式,1:String str1 = "abc";2:String str2 = new String("abc");這兩種存在很大的差異。這里不說,因為此篇的主角是C#。而C#中的string作為引用類型只有一中方式,也就是上述的方式一。在此無論使用“==”還是“Equals”只要是string的字面量相同則比較結果就為ture。這個沒什么好說的,下面說一下非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

        以上的代碼中聲明了一個ObjectA類,并在下方實例化了兩此此類,給此類的屬性賦予了相同的值,通過“==” 與“Equals”比較得到的結果均為false,由此可以推斷出除string外的引用類型兩者比較的都是引用地址。

    0x02:
        等等,先不要著急關閉瀏覽器 。引用類型中還有一個特殊的,那就是匿名類。所以上面的0x01中的總結是有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);                // 如果這面寫直接就會爆語法錯誤的

        上述中聲明了a1,a2,a3三個匿名,其中a1,a2屬性相同,值相同,屬性順序相同。而a3與兩者比較屬性相同,值相同,屬性屬性不相同。則得出的Hash值與兩者也有差異。

    0x03:
        以上實驗結果可以粗略總結為:C#中string(引用類型)通過“==”與“Equals”比較都是對字面量進行比較的,除去string與匿名類外的其他引用類型“==”與“Equals”比較的都是引用地址。而匿名類是通過“==”進行值比較,“Equals”是對引用地址的比較。且還得出匿名類順序不同則AnonyType是不同的類型。

        而序中提到的short.Equals(int)的比較是對我最為困惑的,現(xiàn)在可以根據(jù)以上結果分析,short.Equals中形參是Object類型,而引用類型通過“Equals”比較的是引用地址而非字面值。但int.Equals(int),形參為值類型的int,值類型存儲在棧上比較的是字面值。故返回true而前者返回false。




回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品久久亚洲 | 国产美女福利在线观看 | 亚洲欧美日韩在线 | 天天射天天操天天干 | 啪啪精品| 成人免费视频网站在线观看 | 国产美女h视频 | 亚洲成av人片在线观看无码 | 欧美精品日韩精品国产精品 | 日韩精品专区在线影院重磅 | 国产欧美在线视频 | 99精品久久久 | 国产乱码精品一品二品 | 亚洲免费视频在线观看 | 亚洲国产精品久久久久久 | 久久99国产精品 | 国产精品大片在线观看 | 精品一二三区 | 国产精品美女www爽爽爽视频 | 久久久99精品免费观看 | 岛国二区| 精品欧美久久 | 免费的av | 精品一级电影 | 91最新在线视频 | 欧美精品在线播放 | 午夜私人影院 | www.婷婷| 欧洲毛片| 四虎影院在线观看免费视频 | 欧洲尺码日本国产精品 | 高清欧美性猛交xxxx黑人猛交 | 国产不卡一区 | 91久久国产综合久久91精品网站 | 国产在线一区二区三区 | 1级黄色大片 | 91精品国产欧美一区二区成人 | 亚洲一区欧美 | 成人性视频免费网站 | 久久国产视频一区 | 成人欧美一区二区三区 |