簡體   English   中英

Equals()與靜態字符串.Equals()

[英]Equals() vs Static string.Equals()

通過閱讀有關C#中的字符串比較的信息,我發現了比較2個字符串以查看它們是否相等的多種方法。

我習慣於==來自c ++,但是我了解到,如果將對象與字符串進行比較,則==默認為參考值(或類似值)。

然后對於Equals()方法,可以說我有2個字符串。

string s1 = null;
string s2 = "Hello";

如果我做s1.Equals(s2);

我得到一個空引用異常,因為第一個字符串為空

但是如果我這樣做

string.equals(s1,s2);

它會簡單地返回false ,如果一個值是null ,如果這兩個值是null ,它將返回true因為這兩個字符串將是這等於他們都是null

因此,有什么理由不總是使用string.equals()方法。 另外還有一點,如果我鍵入string.equals()在字符串中使用大寫S喜歡這個S tring.equals()則仍然無線本地環路運行一樣的,如果我有它小寫,但IDE(視覺工作室2015年)會告訴我可以簡化,當我簡化時將其轉換為小寫字母s。 這是為什么?

根據MSDNstring.Equals方法

確定兩個String對象是否具有相同的值。

這就是為什么string.equals(s1,s2); 在您的情況下將始終返回false,並且如果s1s2均為null或具有相同的值,則將返回true。

還有另一件事是,如果我在像這樣的String.equals()的字符串中輸入帶有大寫S的string.equals(),則它的運行方式與小寫但與IDE相同(Visual Studio 2015)會告訴我它可以簡化,當我簡化時將其轉換為小寫字母s。 這是為什么?

string是C#原語,而System.String或簡單String是相應的FCL(框架類庫)類型。 就像intInt32 ,其中int是C#基元,而Int32是相應的FLC類型。

兩種方法都執行以下步驟:

  1. 檢查兩個字符串是否共享相同的引用(如果相同),則返回true 他們通過檢查對象引用來做到這一點(通過檢查(object)a==(object)b做到這一點:兩個object變量上的==運算符僅檢查引用)。 請注意,如果兩個對象都為null ,則此步驟還返回true
  2. 檢查其中一個是否為null (如果任何一個為null ,則返回false
  3. 檢查兩個長度是否匹配(如果不匹配則返回false
  4. 如果到了這一點,它將檢查每個字節,並檢查它們是否匹配(除非您在重載之一中指定了StringComparison類型)(注意:字節比較實現得非常好,即使對性能進行管理也不安全)代碼...但這是您不應該關心的實現細節)

是否使用一個(如果您確定實例不為null )取決於您。 兩者基本上都執行相同的操作,並且性能相同。

鏈接到實現: 實例等於方法靜態字符串。 等於

您無法在null實例上調用實例方法,這就是為什么它會為您拋出NullReferenceException的原因……但是,您的實例為null的事實可能很重要(取決於您的規范),您可能需要在null之前檢查null比較並采取相應措施(使用string.Equals會將其隱藏起來,並且可能更容易出現錯誤)。 如果對您的規格要求不重要,那么使用一個或另一個僅僅是設計決定。

如果您有興趣,可以使用( source link )來實現兩種字符串類型的運算符==

public static bool operator == (String a, String b) {
   return String.Equals(a, b);
}

所以做a == b和做string.Equals(a,b)

至於Stringstring ,前者是System.String (它需要有一個using System;在頂部,或指定整個System.String.Equals ),而后者是一個內置別名(它沒有要求using System;頂部)。 您可以使用其中一種,它們的行為完全相同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM