Mutable Vs. Immutable Variable

Sakda Auchirakarn
T. T. Software Solution
2 min readDec 5, 2023

ใน C# .NET Mutable กล่าวถึง Variable ที่สามารถเปลี่ยนแปลงค่าได้หลังจากที่ประกาศ ซึ่งต่างกับ Immutable ที่ ไม่สามารถ Assign ค่าให้มันได้ หรือก็คือเปลี่ยนแปลงค่ามันไม่ได้นั่นเอง

Variable แทบจะส่วนใหญ่เลย จะมีความเป็น Mutable อยู่แล้วโดย Default เช่นคุณประกาศ Variable ที่เป็น primitive type เช่น (int, string, bool, …) หรือแม้กระทั่ง Object คุณจะสามารถเปลี่ยนค่าให้กับมันได้ (ก็เรื่องปกติหนิ)

string เป็น primitive type นะแต่จะเป็น Immutable โดย Default

int number = 5; // Initial assignment
number = 10; // Changing the value of the variable

แต่ในบางครั้งคุณก็จำเป็นต้องทำให้ Variable เหล่านี้มันเป็น Immutable ด้วยเหตุผลของการอยากให้มัน read-only (ใช้สำหรับ field ที่ต้องการจะ Assign ครั้งแรกครั้งเดียวตอนที่มันสร้าง Object ) หรือ const (ค่าคงที่ ขณะ compile-time)

public class MyClass
{
public readonly int ReadOnlyNumber = 10;
}

const int ConstantNumber = 5;

จากตัวอย่างบน ReadOnlyNumber และ ConstantNumber จะเป็น Immutable เพราะไม่สามารถเปลี่ยนค่ามันได้

Mutable Variable จะถูกนำไปใช้กับการเก็บ data ที่จะสามารถถูกเปลี่ยนค่าได้ตลอดเวลาเช่น Counter, State Information หรือ Data ที่ถูก Handle จาก User Interaction ในทางกลับกัน Immutable Variable ก็จะเหมาะกับการทำ Constant Variable เพิ่มความสามารถในการ predictability (เช่นการลด Magic number ทำให้อ่าน Code ง่ายขึ้น) และลด Side-Effect ที่อาจเกิดขึ้นในโค้ด (เช่นลดการเปลี่ยนแปลงค่าจาก Method ข้างนอก)

แล้วผมเขียนไปทำไม??
คือจริงๆ Programmer ทุกคนก็คงเจอมันมาหมดแล้ว กับตัวแปรเหล่านี้ และรู้ด้วยว่า สถานการณ์ไหนควรใช้ แบบไหน ประเด็นที่ 1 ของผมก็คือ อยากให้ทุกคนได้รู้ว่า Variable เหล่านี้มันมีชื่อเรียกของมัน และควรใช้ให้ถูกวัตถุประสงค์

ประเด็นที่ 2 คือ การใช้ Mutable หรือ Immutable ที่ผิดวิธีอาจก่อให้เกิด Performance Issue ได้เลยน่ะ เช่น ปัญหา การ Concatenation String

string result = "";
for (int i = 0; i < 1000000; i++)
{
result += "a";
}

จากที่กล่าวไว้ข้างต้น string เป็น Primitive Type ที่เป็น Immutable โดย Default การ เปลี่ยนค่า string คือการสร้าง Object string ตัวใหม่เพิ่มเข้าไปใน Memory ดังนั้นจากตัวอย่าง Code เราวน Loop ต่อตัว a เข้าไปเรื่อยๆ เท่ากับเรา Create Object เพิ่มเข้าไปใน Memory 1000000 รอบให้ตายเถอะ!! (นับว่าเป็น Bad Practice ข้อนึงของ .NET เลยน่ะ)

แล้วเราจะเปลี่ยนมันให้เป็น Mutable ยังไงล่ะ? วิธีนึงก็คือใช้ .NET provider ที่ชื่อ StringBuilder

var sb = new StringBuilder();
for (int i = 0; i < 1000000; i++)
{
sb.Append("a");
}
string result = sb.ToString();

การเปลี่ยนจาก Class (Mutable) ไปใช้ Record (Immutable) ก็เป็นอีกตัวอย่างนึงที่เริ่มนิยมใช้กัน เช่นเราต้องการรับค่า Model โดยที่ค่าเหล่านั้นไม่ควรจะถูกเปลี่ยนแปลงเพื่อลด Side-Effect และความซับซ้อน ที่จะเกิดขึ้นหลังจากนั้น เราก็ควรจะใช้ Record แทน

จบแล้วครับ ขอให้บทความ ลอยๆ นี้ของผม มีประโยชน์กับผู้อ่านน่ะครับ
Happy Coding

--

--