ใน C# สามารถกำหนดค่าเดียวกันให้หลายตัวแปรใน Statement เดียวได้ โดยใช้ **Chained Assignment** (การกำหนดค่าแบบโซ่) ซึ่งทำงานจากขวาไปซ้าย
Syntax
val1 = val2 = val3 = value;
ตัวอย่างพื้นฐาน
int val1, val2;
val1 = val2 = 20; // ทั้งคู่เท่ากับ 20
// เทียบเท่ากับ:
val2 = 20;
val1 = val2; // val1 ได้ค่าจาก val2 (ซึ่งคือ 20)
ตัวอย่างโปรแกรมสมบูรณ์
using System;
namespace Demo {
class MyApplication {
static void Main(string[] args) {
int val1, val2;
val1 = val2 = 20;
Console.WriteLine("Value1 = " + val1); // 20
Console.WriteLine("Value2 = " + val2); // 20
}
}
}
ผลลัพธ์
Value1 = 20
Value2 = 20
รายละเอียดการทำงาน
C# Assignment Operator (=) เป็น **Right-Associative** และเป็น **Expression** ที่คืนค่า (Return Value) คือค่าที่ถูก Assign
a = b = c = 10;
// ลำดับการประเมินค่า (Right to Left):
// 1. c = 10 -> คืนค่า 10
// 2. b = (c = 10) -> b = 10, คืนค่า 10
// 3. a = (b = 10) -> a = 10, คืนค่า 10
กรณีใช้งานอื่นๆ
1. กับประเภทข้อมูลต่างกัน (Implicit Conversion)
double d;
int i;
d = i = 10; // i = 10, d = 10.0 (Implicit conversion int -> double)
// แต่ทำค่าตรงข้ามไม่ได้:
// i = d = 10.5; // Compile Error: Cannot implicitly convert double to int
2. กับ Reference Types
string s1, s2;
s1 = s2 = "Hello"; // ทั้งคู่ชี้ไปที่ String Object เดียวกัน
// String เป็น Immutable จึงปลอดภัย
// แต่ถ้าเป็น Mutable Object:
List list1, list2;
list1 = list2 = new List { 1, 2, 3 };
list1.Add(4);
Console.WriteLine(list2.Count); // 4 - แชร์ Reference เดียวกัน!
3. ใน Declaration (C# 7.0+ Tuples)
// ไม่ใช่ Chained Assignment แต่เป็น Tuple Deconstruction
var (x, y) = (10, 10); // x=10, y=10
// หรือ
(int a, int b) = (20, 20);
4. Out Variables (C# 7.0+)
int.TryParse("123", out int a);
int.TryParse("456", out int b);
// a=123, b=456 - แต่ไม่ใช่ Chained Assignment
⚠️ ข้อควรระวัง
- Mutable Objects: Chained Assignment ทำให้ทุกตัวแปรชี้ไป Object เดียวกัน การแก้ไขหนึ่งตัวจะส่งผลต่ออีกตัว
- Readability: ใช้ได้ดีกับค่าคงที่หรือค่าเริ่มต้น แต่อาจอ่านยากถ้า Logic ซับซ้อน
- Side Effects: หลีกเลี่ยงการเรียก Method ที่มี Side Effect ใน Chain
Best Practice
// ✅ ดี - Initialize ค่าเริ่มต้น
int x = 0, y = 0, z = 0;
// หรือ
int x = 0, y = 0, z = 0;
// ✅ ดี - Chained Assignment กับค่าคงที่
int a = b = c = defaultValue;
// ⚠️ ระวัง - กับ Object ที่ Mutable
var list1 = new List();
var list2 = list1; // ชัดเจนกว่า list1 = list2 = new List();