ใน C# string (อ้างอิง System.String) Override Equals และ Operator == ให้เปรียบเทียบ Value Equality (ค่าเนื้อหา) ไม่ใช่ Reference
ตัวอย่างที่ 1: String เท่ากัน
using System;
public class Demo
{
public static void Main(string[] args)
{
string str1 = "John";
string str2 = "John";
Console.WriteLine("String 1 = " + str1);
Console.WriteLine("String 2 = " + str2);
Console.WriteLine("String 1 เท่ากับ String 2: {0}", str1.Equals(str2));
}
}
ผลลัพธ์
String 1 = John String 2 = John String 1 เท่ากับ String 2: True
ตัวอย่างที่ 2: String ไม่เท่ากัน
using System;
public class Demo
{
public static void Main(string[] args)
{
string str1 = "Tom";
string str2 = "Kevin";
Console.WriteLine("String 1 = " + str1);
Console.WriteLine("String 2 = " + str2);
Console.WriteLine("String 1 เท่ากับ String 2: {0}", str1.Equals(str2));
}
}
ผลลัพธ์
String 1 = Tom String 2 = Kevin String 1 เท่ากับ String 2: False
วิธีเปรียบเทียบ String ใน C#
| วิธี | รูปแบบ | คำอธิบาย |
|---|---|---|
| Instance Equals | str1.Equals(str2) | Null-safe (ถ้า str1 ไม่ null) |
| Static Equals | String.Equals(str1, str2) | Null-safe ทั้งคู่ (แนะนำ) |
| == Operator | str1 == str2 | Null-safe อ่านง่าย (แนะนำมากที่สุด) |
| CompareTo | str1.CompareTo(str2) == 0 | คืน -1, 0, 1 (เรียงลำดับ) |
| Ordinal (Case-Sensitive) | String.Equals(str1, str2, StringComparison.Ordinal) | เปรียบเทียบ Binary (เร็วที่สุด) |
| OrdinalIgnoreCase | String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase) | ไม่สนใจ Case |
| CurrentCulture | String.Equals(str1, str2, StringComparison.CurrentCulture) | ตามวัฒนธรรมปัจจุบัน (สำหรับ UI) |
ตัวอย่างการเปรียบเทียบแบบต่างๆ
string a = "Hello"; string b = "hello"; string c = null; Console.WriteLine(a == b); // False (Case-Sensitive) Console.WriteLine(String.Equals(a, b, StringComparison.OrdinalIgnoreCase)); // True Console.WriteLine(String.Equals(c, "test")); // False (Safe) Console.WriteLine(c == "test"); // False (Safe) // String Interning - ค่าคงที่สตริงเดียวกันอาจอ้างอิงออบเจ็กต์เดียวกัน string s1 = "Hello"; string s2 = "Hel" + "lo"; // Compile-time constant -> Interned Console.WriteLine(Object.ReferenceEquals(s1, s2)); // True (Same Reference) string s3 = "Hel"; string s4 = s3 + "lo"; // Runtime -> New Object Console.WriteLine(Object.ReferenceEquals(s1, s4)); // False (Different Reference) Console.WriteLine(s1 == s4); // True (Value Equality)
ข้อสังเกตสำคัญ
- String ใน C# เป็น Immutable Reference Type แต่พฤติกรรม Equals/== เป็น Value Comparison
- ใช้
==หรือString.Equalsสำหรับการเปรียบเทียบทั่วไป (อ่านง่าย Null-Safe) - ระบุ
StringComparisonเสมอสำหรับการเปรียบเทียบที่ชัดเจน (Ordinal vs Culture) StringComparison.Ordinalเร็วที่สุด เหมาะสำหรับ Key, ID, Code ComparisonStringComparison.OrdinalIgnoreCaseเหมาะสำหรับ User Input, Case-Insensitive Match