最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中==(雙等于號(hào))與equals()區(qū)別詳解

 更新時(shí)間:2021年05月25日 14:12:25   作者:陳大寶  
這兩種方式也是大家在日常編碼工作當(dāng)中用的比較多的判斷方式,本文就詳細(xì)的介紹一下C# 雙等于號(hào)與equals()區(qū)別,方便大家理解

這兩種方式也是大家在日常編碼工作當(dāng)中用的比較多的判斷方式、之前在使用的時(shí)候也沒(méi)太關(guān)注兩者在比較不同類型的時(shí)候存在哪些區(qū)別

今天就和大家一起深入了解一下其中區(qū)別

一、值類型比較判斷

對(duì)于值類型來(lái)說(shuō) 兩者之間比較的都是”內(nèi)容”是否相同,即值類型中的數(shù)值是否一樣,很顯然此時(shí)兩者是劃等號(hào)的,代碼展示如下:

#region 值類型判斷
int i = 10;
int j = 10;
Console.WriteLine($"雙等于號(hào)判斷結(jié)果為:{(i == j)}");
Console.WriteLine($"Equals判斷結(jié)果為:{i.Equals(j)}");
 
#endregion

控制臺(tái)輸出:

由此判斷在值類型中使用int類型為例,其中等于號(hào)與Equals二者的判斷不存在區(qū)別、都是比較其中的數(shù)值內(nèi)容、那么引用類型存在區(qū)別嗎一起來(lái)看一看?

二、引用類型比較判斷

對(duì)于引用類型來(lái)說(shuō),等號(hào)(==)比較的是兩個(gè)變量的”引用”是否一樣,即是引用的”地址”是否相同。而對(duì)于equals來(lái)說(shuō)仍然比較的是變量的”內(nèi)容”是否一樣

1、引用類型中字符串比較(String)

#region 引用類型中String比較
Console.WriteLine("----------------我是分割線-----------------------");
string str1 = "abd";
string str2 = "abd";
Console.WriteLine($"雙等于號(hào)判斷結(jié)果為:{(str1 == str2)}");
Console.WriteLine($"Equals判斷結(jié)果為:{str1.Equals(str2)}");
#endregion

控制臺(tái)輸出:

那么問(wèn)題來(lái)了?Equals是比較其中的數(shù)值相等返回True我可以理解、那么字符串中雙等于號(hào)是比較二者之間的引用、很顯然str1變量與str2變量是不同的引用

為什么返回的結(jié)果怎么還是True呢?實(shí)際的原因是什么呢?一起來(lái)看一看

//
// 摘要:
//     Determines whether two specified strings have the same value.
//
// 參數(shù):
//   a:
//     The first string to compare, or null.
//
//   b:
//     The second string to compare, or null.
//
// 返回結(jié)果:
//     true if the value of a is the same as the value of b; otherwise, false.
public static bool operator ==(String? a, String? b);
 
 
//
// 摘要:
//     Determines whether this instance and another specified System.String object have
//     the same value.
//
// 參數(shù):
//   value:
//     The string to compare to this instance.
//
// 返回結(jié)果:
//     true if the value of the value parameter is the same as the value of this instance;
//     otherwise, false. If value is null, the method returns false.
public bool Equals(String? value);

不管是==、還是Equals也好都是微軟提供的public sealed class String密封類下面的提供的方法、看到此時(shí)還看不出其中的緣由、那么直接上反編譯工具看一看究竟。

點(diǎn)擊str3==str2中的等于號(hào)繼續(xù)查看、發(fā)現(xiàn)反編譯中查看這個(gè)方法的源碼返回了Equals這個(gè)方法、這樣一看就大致清楚了、string類型中微軟的開發(fā)

人員對(duì)這個(gè)==進(jìn)行的重寫。

以上是Equals與==反編譯源碼所以這也就是當(dāng)我們?cè)诒容^String類型時(shí)、不同的引用、數(shù)值一樣、Equals與==返回的結(jié)果一致、相同、所以在進(jìn)行String類型判斷

這兩個(gè)方法內(nèi)部本質(zhì)是相同的、當(dāng)然String類型是一個(gè)特例。

2、引用類型中自定義類型比較

#region 引用類型中自定義類型t比較
Console.WriteLine("----------------我是分割線-----------------------");
Car car1 = new Car()
{
    Age = 4,
    Color = "Green"
};
Car car2 = new Car()
{
    Age = 4,
    Color = "Green"
};
 
Console.WriteLine($"雙等于號(hào)判斷結(jié)果為:{(car1 == car2)}");
Console.WriteLine($"Equals判斷結(jié)果為:{car1.Equals(car2)}");

控制臺(tái)輸出:

二者都是輸出False、由于不同的引用實(shí)例、所以引用的地址也是不同的、即使數(shù)值相同==也會(huì)返回False、可能有人會(huì)產(chǎn)生疑問(wèn),car1 和car2的內(nèi)容是相同的啊,為什么他倆的比較結(jié)果卻是為false呢?。原因就在于在Equals是Object中的一個(gè)虛方法,而Car類中沒(méi)有對(duì)它進(jìn)行重寫,因此此時(shí)調(diào)用的仍是父類中的Equals方法。但是父類是無(wú)法知道你都有哪些成員字段的,因此返回的是false。要想讓他能夠比較兩個(gè)變量的內(nèi)容是否相同,那就應(yīng)該重寫Equals方法

3、重寫Equals并測(cè)試

新建類并測(cè)試代碼如下:

public class TwoDPoint : System.Object
    {
        public readonly int x, y;

        public TwoDPoint(int x, int y) 
        {
            this.x = x;
            this.y = y;
        }

        public override bool Equals(System.Object obj)
        {
            if (obj == null)
            {
                return false;
            }

            TwoDPoint p = obj as TwoDPoint;
            if ((System.Object)p == null)
            {
                return false;
            }
            return (x == p.x) && (y == p.y);
        }

        public bool Equals(TwoDPoint p)
        {
            if ((object)p == null)
            {
                return false;
            }

            return (x == p.x) && (y == p.y);
        }

        public override int GetHashCode()
        {
            return x ^ y;
        }


    }

上端調(diào)用測(cè)試

#region 引用類型中自定義類型t比較
  Console.WriteLine("----------------我是分割線-----------------------");

  TwoDPoint twoDPoint1 = new TwoDPoint(4, 8);
  TwoDPoint twoDPoint2 = new TwoDPoint(4, 8);

  Console.WriteLine($"雙等于號(hào)判斷結(jié)果為:{(twoDPoint1 == twoDPoint2)}");
  Console.WriteLine($"Equals重寫后判斷結(jié)果為:{twoDPoint1.Equals(twoDPoint2)}");
  #endregion

控制臺(tái)輸出:

結(jié)果顯示Equals重寫后返回True、==引用的地址不同、所以還是返回False、由此可以證明重寫后驗(yàn)證成功。

總結(jié):Equals比較的永遠(yuǎn)是變量的內(nèi)容是否相同,而= =比較的則是引用地址是否相同(前提:此種類型內(nèi)部沒(méi)有對(duì)Equals 或= = 進(jìn)行重寫操作,否則輸出可能會(huì)有不同)

string類型是個(gè)特例,因?yàn)樗膬?nèi)部對(duì)這兩個(gè)都進(jìn)行了重寫、以上本人親測(cè)有效、有什么需要改善的歡迎大家提出來(lái)、我加以改正。有時(shí)候短短幾行代碼其實(shí)要細(xì)細(xì)研究還是會(huì)細(xì)思極恐

總而言之還是微軟的大佬的給我們封裝好了、我們拿來(lái)用就可以、但是在用的同時(shí)確實(shí)也需要有時(shí)間研究一下其中原理、其實(shí)可以多使用反編譯工具研究一下其中代碼原理、我這里使用的是ILSPY

到此這篇關(guān)于C#中==(雙等于號(hào))與equals()區(qū)別詳解的文章就介紹到這了,更多相關(guān)C# 雙等于號(hào)與equals()區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c#實(shí)現(xiàn)獲取字符串陣列中元素最長(zhǎng)或最短的長(zhǎng)度

    c#實(shí)現(xiàn)獲取字符串陣列中元素最長(zhǎng)或最短的長(zhǎng)度

    下面小編就為大家分享一篇c#實(shí)現(xiàn)獲取字符串陣列中元素最長(zhǎng)或最短的長(zhǎng)度方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助
    2017-12-12
  • 一種c#深拷貝方式完勝java深拷貝(實(shí)現(xiàn)上的對(duì)比分析)

    一種c#深拷貝方式完勝java深拷貝(實(shí)現(xiàn)上的對(duì)比分析)

    下面小編就為大家?guī)?lái)一篇一種c#深拷貝方式完勝java深拷貝(實(shí)現(xiàn)上的對(duì)比分析)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • 基于WPF實(shí)現(xiàn)多選下拉控件的示例代碼

    基于WPF實(shí)現(xiàn)多選下拉控件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了WPF實(shí)現(xiàn)簡(jiǎn)單的多選下拉控件,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下
    2023-02-02
  • Unity實(shí)現(xiàn)畫線條功能

    Unity實(shí)現(xiàn)畫線條功能

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)畫線條功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C#之Expression表達(dá)式樹實(shí)例

    C#之Expression表達(dá)式樹實(shí)例

    這篇文章主要介紹了C#之Expression表達(dá)式樹,包括了表達(dá)式樹的原理與用法技巧,需要的朋友可以參考下
    2014-10-10
  • c#基礎(chǔ)系列之值類型和引用類型的深入理解

    c#基礎(chǔ)系列之值類型和引用類型的深入理解

    這篇文章主要給大家介紹了關(guān)于c#基礎(chǔ)系列之值類型和引用類型的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • C# char[]與string byte[]與string之間的轉(zhuǎn)換詳解

    C# char[]與string byte[]與string之間的轉(zhuǎn)換詳解

    在本篇文章里小編給大家分享的是關(guān)于C# char[]與string byte[]與string之間的轉(zhuǎn)換的知識(shí)點(diǎn)內(nèi)容,需要的朋友們參考下
    2019-11-11
  • 基于WPF實(shí)現(xiàn)驗(yàn)證碼控件

    基于WPF實(shí)現(xiàn)驗(yàn)證碼控件

    這篇文章主要介紹了如何利用WPF實(shí)現(xiàn)一個(gè)簡(jiǎn)單的驗(yàn)證碼控件,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下
    2022-08-08
  • C#實(shí)現(xiàn)向多線程傳參的三種方式實(shí)例分析

    C#實(shí)現(xiàn)向多線程傳參的三種方式實(shí)例分析

    這篇文章主要介紹了C#實(shí)現(xiàn)向多線程傳參的三種方式,以實(shí)例形式較為詳細(xì)的分析了C#多線程及參數(shù)傳遞的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • C#開發(fā)微信公眾號(hào)接口開發(fā)

    C#開發(fā)微信公眾號(hào)接口開發(fā)

    這篇文章主要介紹了C#微信公眾號(hào)接口開發(fā),靈活利用網(wǎng)頁(yè)授權(quán)、帶參數(shù)二維碼、模板消息,提升用戶體驗(yàn)之完成用戶綁定個(gè)人微信及驗(yàn)證碼獲取,需要的朋友可以參考下
    2015-07-07

最新評(píng)論

浦江县| 永康市| 延边| 黔东| 桂阳县| 昌图县| 汾阳市| 大田县| 淮滨县| 增城市| 西吉县| 建水县| 邵东县| 东安县| 林芝县| 牡丹江市| 什邡市| 宜君县| 南阳市| 广灵县| 桐乡市| 蕲春县| 晴隆县| 德州市| 西昌市| 厦门市| 扎囊县| 翁源县| 定西市| 阿克| 闸北区| 通榆县| 宝山区| 改则县| 界首市| 双流县| 扎赉特旗| 银川市| 盐源县| 阿拉善右旗| 安徽省|