1. 程式人生 > >C#中==與Equals區別

C#中==與Equals區別

C#中的相等有兩種型別:引用相等(ReferenceEquals)值相等(Equals)。值相等就是說兩個物件包含相同的值。而引用相等則比較的是兩個物件的引用是否是同一個物件。也就是說,如果ReferenceEqualsTrue,則Equals必然為True,反過來就不一定了。

這樣的話可以看出來,ReferenceEquals我們沒有比較去管他什麼,系統自動解決,object類實現的靜態RefrenceEquals函式就夠了。而對於自定義的型別的話,如果想要實現判斷值相等,是需要重寫Equals函式的。

我們可以看一下string和自定義類的對比:

string strA = "Hello

";

string strB = string.Copy(strA);

Console.WriteLine(strA == strB);         //True

Console.WriteLine(strA.Equals(strB));    //True

Console.WriteLine(object.Equals(strA, strB));    //True

Console.WriteLine(object.ReferenceEquals(strA, strB));       //False

class MyClass

{

    public int value = 1;

}

...

MyClass oA = new

 MyClass();

MyClass oB = new MyClass();

Console.WriteLine(oA == oB);   //False

Console.WriteLine(oA.Equals(oB));  //False

Console.WriteLine(object.Equals(oA, oB));  //False

Console.WriteLine(object.ReferenceEquals(oA, oB)); //False

先不考慮==號,看幾個Equals的表現,Equals是要實現值相等比較的效果的,.net 在實現string的時候就重寫了Equals(object) ,並新增過載函式

Equals(string) ,因此兩個比較才會返回True。而不實現這兩個函式的後果就是都返回False,無法符合Equals函式應有的作用。

由此看來,對於之前我的需求:比較兩個自定義類的內容是否相同,還是應該重寫Equals(Object),並建議過載對自己的類的實現Equals(MyClass)

而對於==運算子的解釋為:通過過判斷兩個引用是否指示同一物件來測試是否相等。也就是引用相等了,可對於上面對string的測試,RefrenceEqualsFalse時,==卻返回的True,這是因為還有這麼一條:當型別不可變(即例項中包含的資料不可更改)時,通過過載運算子== 來比較值是否相等而不是比較引用是否相等可能會很有用

我們大部分情況下寫的自定義類都是可變的,所以一般用不到也不應該對==進行過載


相關推薦

C#==Equals區別

C#中的相等有兩種型別:引用相等(ReferenceEquals)和值相等(Equals)。值相等就是說兩個物件包含相同的值。而引用相等則比較的是兩個物件的引用是否是同一個物件。也就是說,如果ReferenceEquals為True,則Equals必然為True,反過來就不

c++->.的區別

->是指標型別,是指標引用 .是例項化物件,類中普通成員的引用 例如 class student { public:                 string name[20]; } 第一種情況,採用指標訪問 student *xy,則訪問時需要寫成 *xy.n

C++*&的區別

*是取值運算子,對地址使用可以獲得地址中儲存的數值。 對於指標a,*a表示取a中的值 &是地址運算子,對變數使用可以獲得該變數的地址。 對於變數b,&b表示取b的地址 在定義時,* 是一個識別符號,宣告該變數是一個指標,比如說int *p; 那

C++/C!和~的區別作用

區別: !是邏輯運算子(與||,&&是一類符號),表示邏輯取反,可以把非0值變成0,把0值變為1 ~是位運算子(與|,&是一類符號),表示按位取反,在數值的二進位制表示上,將0變為1,將1變為0 例子: #include<io

C# Reference Equals, == , Equals區別

Equals 的預設實現僅支援引用相等,但派生類可重寫此方法以支援值相等。 對於引用型別,相等定義為物件相等;即這些引用是否引用同一物件。對於值型別,相等定義為按位相等。ValueType 類支援值型別。 給實現者的說明 此方法可由派生類重寫。例如,如果兩個物件表示相同的值,則許多基資料型別返回 true;

C#Equals==

System.Object提供了Equals()虛方法: class Object { public virtual Boolean Equals(object o) { if (this == o) return true; else return false; } } 這種判斷方式非常簡單:直接比較是兩個

java==equals區別

在最近做題當中,發現==和equals一直讓我傻傻的搞不清楚,因此寫這一篇部落格,來總結一下 學習的結果。 首先上程式碼 Integer i1=9;

C# ==和equals區別

不想說太多,直接上程式碼,這兩個就沒什麼聯絡,有自己獨立的規則。比較其實不利於記憶。 下面是測試程式碼 private static void Main(string[] args) { Console.WriteLine("--equals

java==equals

字符串 基本類型 true 變量 由於 als 不同 引用 str2 ==   ==可用於比較基本類型與引用類型,對於基本類型變量比較的是其存儲的值是否相等,對於引用類型則比較的是其是否指向同一個對象。 如: int a = 10; int b = 20; d

C#equals()和==

字符 using ace read true names ati 以及 args using System; namespace EqualsTest { class EqualsTest { static void Main(strin

Mybatis#$的區別

根據 class select ssi 什麽 jdb 解析 lec 後臺 1.兩者都是動態的向sql語句中傳入需要的參數 2.#傳入的參數在SQL中顯示為字符串 eg:select id,name,age from student where id =#{id},

筆記:MyBatis$#的區別

首先MyBatis中 $與#都是動態傳參 # 將傳入的資料都當成一個字串,會對自動傳入的資料加一個雙引號 $ 將傳入的資料直接顯示生成在sql中 # 佔位符號,能夠很大程度防止sql注入「語句的拼接」 $ sql拼接符號,無法防止Sql注入 如果使用在order by中就需要使用 $

mybatis${}#{}的區別

mybatis中${}和#{}都可以在增刪改查中使用 select * from student where name = ${name}; select * from student where name = #{name}; 二者的意思相同,都可以用來查詢資料庫中的內容,且查詢的結果

Mybatis${ }#{ }的區別

今天看BBS,看到有關於面試問題的一個帖子,裡面提到了關於Mybatis中的#{}和${}的區別,這裡也簡單總結記錄下。 #{ }:預編譯處理,字串替換,進行型別匹配 Mybatis處理#{}時,會將SQL語句中的變數#{}替換成?號,呼叫PreparedS

C++QML物件互動

        所有的 QML 物件型別 - 無論由引擎內部實現還是由第三方源定義,都是 QObject 派生的型別。這意味著,QML 引擎可以使用 Qt 元物件系統動態例項化任何 QML 物件型別並檢查建立的物件。        這對於在 C++ 中建立 QML 物件非常

python / // 的區別

一、‘/’表示浮點除法 ‘/’一個槓除法表示: 無論是整數除以浮點數還是浮點數除以整數,或者整數除以整數,浮點數除以浮點數,結果都是浮點數 5/2 Out[19]: 2.5 4/2 Out[20]: 2.0 二、‘//’表示整數除法 ‘//’兩個槓除法表示: 只輸出整數

Java&&&的區別,|||的區別

這個是轉載別人的 個人感覺不錯, 在java中,很多人都不知道&與&&,|與||的區別。 &,&&:(與,短路與):一樣的地方就是二者執行最後的結果是一樣的,但是執行的過程有區別, 對於&:無論&左邊是

mybitis面試題基礎必考 Mybatis $#的區別

1 #是將傳入的值當做字串的形式,eg:select id,name,age from student where id =#{id},當前端把id值1,傳入到後臺的時候,就相當於 select id,name,age from student where id ='1'.  2 $是將傳入的資料直接顯示

H5區別

區別就是沒區別,在H5出現以後,主張語義化標籤,<header>、<footer>等html5的這幾個標籤都是收集了網上數百萬網站上出現概率比較多的部分確定的,比如網站80%都

c++->和.的區別

->用在指標型別的類例項的,而.用在例項化物件的指向。 下面是例子 #include <iostream> using namespace std; class Complex { private: double real; double image;