「 」「 Equals」之間的差別。

2021-04-09 04:34:15 字數 1208 閱讀 1381

equals 方法只是在 system.object 中定義的乙個虛擬方法,它由任何選擇執行該任務的類所重寫。== 運算子是乙個可由類過載的運算子,該類通常具有恒等行為。

對於未過載 == 的引用型別,該運算子會比較兩個引用型別是否引用同一物件,而這恰好是 system.object 中的 equals 實現所做的工作。

對於未過載 == 的值型別,該運算子會比較這兩個值是否"按位"相等,即是否這兩個值中的每個欄位都相等。當您對值型別呼叫 equals 時,仍然會發生這一情況,但這一次,該實現是由 valuetype 提供的,並且使用反射進行比較,從而使比較速度比特定於型別的實現慢很多。

到此為止,二者是如此類似。二者之間的主要區別是多型。運算子被過載而不是被重寫,這意味著除非編譯器知道呼叫更為具體的版本,否則它只是呼叫恒等版本。為闡明這一點,請看下面這個示例:

using system;

public class teststatic void main()

// create two equal but distinct strings

string a = new string(new char );

string b = new string(new char );

console.writeline (a==b);

console.writeline (a.equals(b));

// with variables of type object

object c = a;

object d = b;

console.writeline (c==d);

console.writeline (c.equals(d));

結果是:

truetrue

false

true

第三行是 false,原因在於編譯器不知道 c 和 d 的內容都是字串引用,因而只能呼叫 == 的非過載版本。因為它們是對不同字串的引用,所以恒等運算子返回 false。

那麼,應該如何區別使用這些運算子呢?我的準則是:對於幾乎所有引用型別,當您希望測試相等性而不是引用一致性時,請使用 equals。例外的情況是字串 - 使用 == 比較字串確實會使事情簡單得多,而且**可讀性更好,但是 您需要記住,該運算子的兩端都必須是型別字串表示式,才能使比較正常進行。

對於值型別,我通常使用 ==,因為除非值型別本身包含引用型別(這種情況極為罕見),否則是恒等還是相等的問題無關緊要。

C 中 與Equals辦法的差別

輸出成果 true true false true false false true true 總結如下 1 對於值型別,和equals等價,都是鬥勁儲存資訊的內容。2 對於引用型別,鬥勁的是引用型別在棧中的位址,equals辦法例鬥勁的是引用型別在託管堆中的儲存資訊的內容。3 對於string類要...

設計模式之間的差別

模板方法與策略模式的區別 模板方法是在父類中,定義出方法的骨架,需要在子類中重寫某個步驟 策略模式,是在父類中定義乙個方法,然後重寫這個方法 模式和裝飾器模式的區別 模式是與原物件實現同乙個介面,必須要實現原介面和持有真實的物件,才能稱之為 類。模式一定是自身持有這個物件,不需要從外部傳入。用 模式...

ROM,RAM,記憶體,硬碟之間的差別

內存在電腦中起著舉足輕重的作用。記憶體一般採用半導體儲存單元,包括隨機儲存器 ram 唯讀儲存器 rom 以及快取記憶體 cache 只不過因為ram是其中最重要的儲存器,所以通常所說的記憶體即指電腦系統中的ram。ram要求每時每刻都不斷地供電,否則資料會丟失。如果在關閉電源以後ram中的資料也不...