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

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

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

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

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

一、值類型比較判斷

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

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

控制臺輸出:

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

二、引用類型比較判斷

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

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

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

控制臺輸出:

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

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

//
// 摘要:
//     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密封類下面的提供的方法、看到此時還看不出其中的緣由、那么直接上反編譯工具看一看究竟。

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

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

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

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

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

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

控制臺輸出:

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

3、重寫Equals并測試

新建類并測試代碼如下:

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)用測試

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

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

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

控制臺輸出:

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

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

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

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

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

相關(guān)文章

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

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

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

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

    下面小編就為大家?guī)硪黄环Nc#深拷貝方式完勝java深拷貝(實現(xiàn)上的對比分析)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • 基于WPF實現(xiàn)多選下拉控件的示例代碼

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

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

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

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

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

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

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

    這篇文章主要給大家介紹了關(guān)于c#基礎(chǔ)系列之值類型和引用類型的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(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)換的知識點(diǎn)內(nèi)容,需要的朋友們參考下
    2019-11-11
  • 基于WPF實現(xiàn)驗證碼控件

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

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

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

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

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

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

最新評論

体育| 姜堰市| 瑞昌市| 岢岚县| 杭锦后旗| 武宁县| 两当县| 密云县| 襄城县| 东海县| 闻喜县| 苏州市| 长沙县| 改则县| 牟定县| 时尚| 武夷山市| 芦山县| 噶尔县| 临猗县| 临澧县| 宜宾市| 宁晋县| 安康市| 山丹县| 文安县| 洛浦县| 珲春市| 谢通门县| 山东省| 新闻| 白城市| 湘乡市| 河北区| 郯城县| 古丈县| 营山县| 新乐市| 泗洪县| 津南区| 房山区|