c#?==操作符和equals方法的使用區(qū)別
在C#中,"=="操作符和Equals()方法有著不同的用途和行為。
==操作符判斷的是堆棧中的值,Equlas判斷的是堆中的值。
C#提供值類型和引用類型,值類型存儲(chǔ)在棧上,故用==判斷是直接判斷其值是否相等,因?yàn)橹殿愋筒淮嬖诙阎械臄?shù)據(jù),因此值類型的Equals也是判斷數(shù)據(jù)。即,對(duì)于值類型而言,==與Equals相同,均是判斷其值是否相等。
對(duì)于引用類型而言,其棧中存儲(chǔ)的是對(duì)象的地址,那么==就是比較兩個(gè)地址是否相等,即是否指向同一個(gè)對(duì)象;Equals函數(shù)則是比較兩個(gè)對(duì)象在堆中的數(shù)據(jù)是否一樣,即兩個(gè)引用類型是否是對(duì)同一個(gè)對(duì)象的引用。
"=="操作符:
- "“操作符用于比較兩個(gè)對(duì)象的值是否相等。當(dāng)使用”"操作符比較兩個(gè)引用類型的對(duì)象時(shí),它會(huì)比較它們的引用是否指向相同的內(nèi)存地址。
- 對(duì)于值類型(如int、double等),"=="操作符比較它們的實(shí)際值。如果值相等,則返回true,否則返回false。
Equals()方法:
- Equals()方法是一個(gè)虛擬方法,定義在System.Object類中,因此所有的類都可以使用它。
- 在默認(rèn)情況下,Equals()方法的行為與"=="操作符相同,即它用于比較兩個(gè)對(duì)象的值是否相等。
- 但是,類可以重寫Equals()方法以改變其行為。重寫Equals()方法通常用于自定義類來(lái)定義自定義的相等性比較規(guī)則。
總結(jié):
- "=="操作符用于比較引用類型的對(duì)象的引用或值類型的實(shí)際值。
- Equals()方法用于比較對(duì)象的值是否相等,且可以被重寫以自定義相等性比較規(guī)則。
因此,一般情況下,對(duì)于引用類型,應(yīng)該使用"=="操作符來(lái)比較對(duì)象的引用,而對(duì)于值類型或者自定義類,應(yīng)該使用Equals()方法來(lái)比較它們的值。
重寫equals方法只要兩個(gè)對(duì)象的字段的值相等就相等不比較對(duì)象的引用地址
沒(méi)重寫前,兩個(gè)對(duì)象雖然字段的值相同,但是為兩個(gè)不同的對(duì)象,引用地址不同,結(jié)果為不相等。
public class stu{ public int id; public string name; } internal class Program { private static void Main(string[] args) { Console.WriteLine("c#equals和==的區(qū)別"); // int c = 1;s stu a = new stu() { id = 1, name = "pzx" }; stu b = new stu() { id = 1, name = "pzx" }; if (a.Equals(b)) { Console.WriteLine("a等于b"); } else { Console.WriteLine("a不等于b"); } } }
重寫后(值判斷,不比較引用地址)輸出相等
internal class stu { public int id; public string name; /// <summary> /// 重寫equal方法 /// </summary> /// <param name="stu"></param> /// <returns></returns> public override bool Equals(object? obj) { if (obj == null) return false; stu stu1 = (stu)obj; Type type = obj.GetType(); var property = type.GetFields(); foreach (var prop in property) { if (prop.GetValue(this).Equals(prop.GetValue(stu1))) { return true; } } return false; } }
到此這篇關(guān)于c# ==操作符和equals方法的使用區(qū)別的文章就介紹到這了,更多相關(guān)c# ==操作符和equals方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入淺出掌握Unity ShaderLab語(yǔ)法基礎(chǔ)
Unity中所有Shader文件都通過(guò)一種陳述性語(yǔ)言進(jìn)行描述,稱為“ShaderLab”, 這篇文章主要介紹了Unity圖形學(xué)之ShaderLab入門基礎(chǔ),需要的朋友可以參考下2023-05-05C# 建造者模式(Builder Pattern)詳細(xì)講解
建造者模式是一種創(chuàng)建型設(shè)計(jì)模式,通過(guò)將復(fù)雜對(duì)象的構(gòu)建過(guò)程與其表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示,它適用于構(gòu)建過(guò)程復(fù)雜且涉及多個(gè)步驟的場(chǎng)景,本文介紹C# 建造者模式(Builder Pattern)詳細(xì)講解,感興趣的朋友一起看看吧2025-03-03C#實(shí)現(xiàn)給Word每一頁(yè)設(shè)置不同圖片水印
Word中設(shè)置水印時(shí),可加載圖片設(shè)置為水印效果,但通常添加水印效果時(shí),會(huì)對(duì)所有頁(yè)面都設(shè)置成統(tǒng)一效果。本文將利用C#實(shí)現(xiàn)給Word每一頁(yè)設(shè)置不同圖片水印的效果,需要的可以參考一下2022-02-02