C# 字串比較的困惑:String.Equals()
方法和 ==
運算子是否可互換?
在 C# 中,字串比較有時會產生令人意外的結果。一個常見的問題是 String.Equals()
方法和 ==
等號運算子的行為是否完全相同。
考慮以下程式碼片段:
<code class="language-csharp">string s = "Category"; TreeViewItem tvi = new TreeViewItem(); tvi.Header = "Category"; Console.WriteLine(s == tvi.Header); // false Console.WriteLine(s.Equals(tvi.Header)); // true Console.WriteLine(s == tvi.Header.ToString()); // true</code>
儘管 s
和 tvi.Header
都包含相同的值 "Category",但 ==
運算子回傳 false
,而 String.Equals()
方法回傳 true
。這就提出了一個問題:為什麼這兩種比較方法會產生不同的結果?
String.Equals()
和 ==
之間的關鍵差異
String.Equals()
和 ==
運算子之間有兩個根本區別:
==
運算子根據物件的編譯時類型進行比較,而String.Equals()
是多態的,這表示它的實作取決於被比較物件的執行時間類型。 ==
運算子在比較空參考時不會拋出異常,而 String.Equals()
如果任何一個參數為空,則會拋出 NullReferenceException
異常。 示範差異的範例
為了說明這些差異,請考慮以下程式碼:
<code class="language-csharp">object x = new StringBuilder("hello").ToString(); object y = new StringBuilder("hello").ToString(); if (x.Equals(y)) // True if (x == y) // False</code>
儘管 x
和 y
值相同,但 ==
運算子回傳 false
,因為它根據物件的編譯時類型(object
)進行比較,而這些類型是不同的。為了獲得正確的比較,必須將物件明確轉換為適當的類型(在本例中為 string
)。
<code class="language-csharp">string xs = (string)x; string ys = (string)y; if (xs == ys) // True</code>
結論
雖然 String.Equals()
和 ==
運算子通常可以互換使用,但了解它們在實作和空值處理方面的細微差別非常重要。為了確保可靠一致的字串比較,通常建議使用 String.Equals()
方法,尤其是在比較不同類型的物件或處理空引用時。
以上是C# 中的字串比較:何時「String.Equals()」和「==」可以互換?的詳細內容。更多資訊請關注PHP中文網其他相關文章!