在 C# 中主要有兩種比較方式, == 和 Equals
== 是用來比較兩個的記憶體位置是否相同,在 C# 中字串是不可變的(immutable),所有字串都會共用一個字串常數,所以比較結果都會相同。
在 C# 中所有物件都繼承 System.Object ,而 System.Object 中有 Equals 這個虛擬方法,所以所有物件都可以使用 Equals 來進行比較。通常我們使用 Equals 比較並不是為了驗證兩者的記憶體位置是否相等,而是想要確認內容是否相同,所以在建立自訂物件時通常都會覆寫 Equals 方法,讓我們可以比較兩者是否相同:
離題了,以字串來說在 C# 中 == 和 Equals 的比較結果都一樣。
不過本篇主要是因為筆者在逛 Microsoft.Learn 的時候意外的發現有 String.Equals 這個方法,並且還可以傳入 StringComparison。
以前筆者在比較需要在乎大小寫的字串時通常都會這樣比較:
都會先把兩邊 ToUpper(或是 ToLower),先轉換成大寫再比較,但其實可以這樣做:
或是:
兩個都是同樣用來比較「不區分大小寫」的字串比較,聽說使用 Ordinal 或是 OrdinalIgnoreCase 都是最快的,是依照二進位值來比較大小,兩個差別只有在是否區分大小寫。 雖然不太確定和使用 ToUpper 的比較方式在速度上面差多少,但是看起來可能有比較專業就是了,在這裡分享給大家。
參考資料:
Microsoft.Learn - Object.Equals Method
Microsoft.Learn - String.Equals Method
== 是用來比較兩個的記憶體位置是否相同,在 C# 中字串是不可變的(immutable),所有字串都會共用一個字串常數,所以比較結果都會相同。
在 C# 中所有物件都繼承 System.Object ,而 System.Object 中有 Equals 這個虛擬方法,所以所有物件都可以使用 Equals 來進行比較。通常我們使用 Equals 比較並不是為了驗證兩者的記憶體位置是否相等,而是想要確認內容是否相同,所以在建立自訂物件時通常都會覆寫 Equals 方法,讓我們可以比較兩者是否相同:
public class User
{
public string Id { get; set; }
public string Name { get; set; }
public override bool Equals(object? obj)
{
if (obj is not User user) return false;
return user.Id == this.Id && user.Name == this.Name;
}
}
離題了,以字串來說在 C# 中 == 和 Equals 的比較結果都一樣。
不過本篇主要是因為筆者在逛 Microsoft.Learn 的時候意外的發現有 String.Equals 這個方法,並且還可以傳入 StringComparison。
以前筆者在比較需要在乎大小寫的字串時通常都會這樣比較:
string input = "ruyut";
if (input.ToUpper() == "Ruyut".ToUpper())
{
Console.WriteLine("相等");
}
都會先把兩邊 ToUpper(或是 ToLower),先轉換成大寫再比較,但其實可以這樣做:
string input = "ruyut";
if (string.Equals(input, "Ruyut", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("相等");
}
或是:
string input = "ruyut";
if (input.Equals("Ruyut", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("相等");
}
兩個都是同樣用來比較「不區分大小寫」的字串比較,聽說使用 Ordinal 或是 OrdinalIgnoreCase 都是最快的,是依照二進位值來比較大小,兩個差別只有在是否區分大小寫。 雖然不太確定和使用 ToUpper 的比較方式在速度上面差多少,但是看起來可能有比較專業就是了,在這裡分享給大家。
參考資料:
Microsoft.Learn - Object.Equals Method
Microsoft.Learn - String.Equals Method
感謝分享~
回覆刪除