Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

กำหนดค่าเดียวกันให้หลายตัวแปรในบรรทัดเดียว C#

ใน 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();