วิธีที่ 1: Tuple Deconstruction (C# 7.0+) - แนะนำมากที่สุด
สมัยใหม่ อ่านง่าย เร็ว ปลอดภัย ไม่ต้อง Temp Variable
int a = 30, b = 60;
(a, b) = (b, a); // Swap ในบรรทัดเดียว!
Console.WriteLine($"a={a}, b={b}"); // a=60, b=30
วิธีที่ 2: Bitwise XOR Operator (Classic One-Liner)
ใช้ XOR Swap Algorithm - ไม่ต้อง Temp Variable ทำงานกับ Integer เท่านั้น
int a = 30, b = 60;
a = a ^ b ^ (b = a); // One-liner แบบคลาสสิก
Console.WriteLine($"a={a}, b={b}"); // a=60, b=30
การทำงานของ XOR Swap
// ขั้นตอนแยก (เหมือนกับ One-liner)
a = a ^ b; // a = 30 ^ 60
b = a ^ b; // b = (30^60) ^ 60 = 30
a = a ^ b; // a = (30^60) ^ 30 = 60
วิธีที่ 3: Arithmetic (บวก-ลบ)
int a = 30, b = 60;
a = a + b; // a = 90
b = a - b; // b = 90 - 60 = 30
a = a - b; // a = 90 - 30 = 60
โค้ดตัวอย่างสมบูรณ์
using System;
class Demo {
public static void Main(String[] args) {
int val1 = 30;
int val2 = 60;
Console.WriteLine("Values before swap:");
Console.WriteLine($"val1 = {val1}, val2 = {val2}");
// วิธีที่ 1: Tuple Deconstruction (Modern C#)
(val1, val2) = (val2, val1);
Console.WriteLine("\nValues after swap (Tuple):");
Console.WriteLine($"val1 = {val1}, val2 = {val2}");
// Reset
val1 = 30; val2 = 60;
// วิธีที่ 2: XOR One-liner
val1 = val1 ^ val2 ^ (val2 = val1);
Console.WriteLine("\nValues after swap (XOR):");
Console.WriteLine($"val1 = {val1}, val2 = {val2}");
}
}
ผลลัพธ์
Values before swap:
val1 = 30, val2 = 60
Values after swap (Tuple):
val1 = 60, val2 = 30
Values after swap (XOR):
val1 = 60, val2 = 30
ตารางเปรียบเทียบ
| วิธี | รองรับ Type | อ่านง่าย | ประสิทธิภาพ | แนะนำ |
|---|---|---|---|---|
Tuple (a,b)=(b,a) |
ทุก Type | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ✅ Best |
| XOR One-liner | Integer เท่านั้น | ⭐⭐ | ⭐⭐⭐⭐ | Legacy/Embedded |
| Arithmetic | Number Types | ⭐⭐⭐ | ⭐⭐⭐ | ❌ Overflow Risk |
| Temp Variable | ทุก Type | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ✅ Classic Safe |
⚠️ ข้อจำกัดของ XOR Swap
- ทำงานกับ Integer Types เท่านั้น (int, long, short, byte, etc.)
- ไม่ทำงานกับ Floating Point, Decimal, String, Object
- ถ้า a และ b อ้างอิงตัวแปรเดียวกัน (
refหรือ Same Variable) จะได้ 0 - อ่านโค้ดยาก ไม่ใช่ Self-Documenting
สรุปแนะนำ
C# 7.0+: ใช้ (a, b) = (b, a); เสมอ - สะดวก เร็ว อ่านง่าย รองรับทุก Type
C# เก่า: ใช้ Temp Variable - เข้าใจง่าย ปลอดภัย ไม่มีข้อจำกัด
อย่าใช้: Arithmetic/XOR One-liner ใน Production Code (ยกเว้น Embedded Systems)