ใน C# มี 2 วิธีเปรียบเทียบค่า: Equality Operator (==) และ Equals() Method พฤติกรรมต่างกันไปตามประเภท (Reference Type vs Value Type)
Reference Types (Class, String, Array, Delegate)
==: เปรียบเทียบ Reference Identity (ชี้ Object เดียวกันหรือไม่) - ยกเว้น String ที่ Overload ไว้Equals(): เปรียบเทียบ Value/Content (ถ้า Override ไว้)
Value Types (Struct, int, DateTime, Enum)
==และEquals()ทั้งคู่เปรียบเทียบ Value
ตัวอย่าง: String (Reference Type แต่ Overload ==)
string s1 = "hello";
string s2 = "hello";
Console.WriteLine(s1 == s2); // True (Value - String Overload ==)
Console.WriteLine(s1.Equals(s2)); // True (Value)
object o1 = "hello";
object o2 = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
Console.WriteLine(o1 == o2); // False (Reference - ตัวแปรต่างกัน)
Console.WriteLine(o1.Equals(o2)); // True (Value - String.Equals Override)
ผลลัพธ์
True True False True
สรุปพฤติกรรม
| ประเภท | == (Operator) | Equals() |
|---|---|---|
| Value Type (int, struct) | Value Comparison | Value Comparison |
| Reference Type (class) | Reference Comparison | Reference Comparison (Default) |
| String | Value Comparison (Overload) | Value Comparison (Override) |
| Delegate | Reference Comparison | Reference Comparison |
แนวทางปฏิบัติที่ดี
- ใช้
Object.Equals(a, b)(Static) - ปลอดภัยกับ Null ทั้งคู่ - Override
Equals()และGetHashCode()คู่กันสำหรับ Custom Types - Implement
IEquatable<T>สำหรับ Value Types - ใช้
StringComparisonEnum สำหรับ String Comparison ที่ชัดเจน
// Safe Null Handling bool areEqual = Object.Equals(obj1, obj2); // True if both null // String Comparison Best Practice bool equals = string.Equals(s1, s2, StringComparison.OrdinalIgnoreCase);