Difference between readonly and const keyword

กิติยา ผ่องแผ้ว 650710528

Const คืออะไร ?

ค่าคงที่ (Constants) เป็นการอ้างถึงข้อมูลเช่นเดียวกับ ตัวแปร (Variable) สิ่งที่แตกต่างคือ ค่าของมันไม่สามารถเปลี่ยนแปลงได้อีก หลังจากการประกาศในภาษา C# ค่าคงที่จะต้องถูกประกาศโดยระบุชนิดของข้อมูล ค่าตั้งต้น และ ต้องระบุคีย์เวิร์ด const ในการประกาศค่าคงที่ก่อนถูกนำมาใช้งานเสมอ

การประกาศค่าคงที่ในภาษา C# มีรูปแบบดังนี้

รูปแบบการใช้ const
const type identifier = value;

ตัวอย่างการใช้

Example
const int SIZE= 5;
const float PI = 3.14f;
const double G = 9.8;

เพราะว่าค่าคงที่แบบ const จะไม่มีทางเปลี่ยนแปลง มันจึงถูก define เป็นส่วนหนึ่งของ type แบบ static member ไม่ใช่ instance member เหมือน field ทั่วไป และเมื่อมีการอ้างอิง const ณ ส่วนใดของโค้ด compiler จะดึงค่าที่ผูกไว้ไปฝังไว้ใน IL ทำให้ขณะรันโปรแกรมไม่จำเป็นต้อง allocate memory

Readonly คืออะไร ?

C# มี keyword readonly สำหรับกำหนดค่าคงที่แบบ runtime constant ถูกสร้างมาเพื่อป้องกันไม่ให้มีการเปลี่ยนค่าตัวแปร แต่สามารถกำหนดค่าผ่าน constructor ได้อย่างเดียว และ readonly สามารถใช้ได้กับ reference type ทั้งยังสามารถย้ายการกำหนดค่ามาไว้ใน constructure ได้

ตัวอย่างการใช้

Example 1
public class TestClass { 
    public readonly string ConnectionString = "TestConnection";
    
    public TestClass(){
        ConnectionString = "DifferentConnection"
    }

    public void TestMethod (){
        ConnectionString = "NewConnection";//Will not compile
    }
}

ในตัวอย่างข้างต้น แสดงให้เห็นว่าตัวแปรสามารถมีค่าต่างกันได้สำหรับ constructors ที่แตกต่างกันใน class เดียวกัน

Example 2
class SomeClass { 
    private readonly DateTime rightNow; 
    
    public readonly DateTime later = DateTime.Now.AddHours(2);
    
    public SomeClass() {
        this.rightNow = DateTime.Now;
    }
}

ในตัวอย่างที่ 2 จะมี 2 readonly field ที่เป็น private และ public โดยตัวแรกจะไม่ได้ตั้งค่าให้ ส่วนตัวที่ 2 จะถูกตั้งค่าให้ และใน class SomeClass ได้ตั้งค่าของ rightNow ใน constructor อย่างที่ได้กล่าวไว้ข้างต้นว่า นอกจากใน constructor แล้ว readonly จะไม่สามารถเปลี่ยนค่าได้อีก compiler จะเตือนว่ามีข้อผิดพลาดเกิดขึ้น

แล้ว Readonly กับ Const แตกต่างกันยังไงล่ะ ?

ในส่วนนี้ จะพูดถึงความแตกต่างในการใช้งาน const และ readonly ในภาษา C# ซึ่งรวมถึงการกำหนดค่าเริ่มต้นและการกำหนดค่าใหม่ ขอบเขตและตัวปรับการเข้าถึง การจัดสรรหน่วยความจำ และข้อพิจารณาด้านประสิทธิภาพ ดังนี้

1. การกำหนดค่าเริ่มต้นและการกำหนดค่าใหม่ (Initialization and Assignment)

หนึ่งในความแตกต่างที่สำคัญคือค่าของ const จะถูกกำหนดในระหว่างการคอมไพล์ (compile-time) ในขณะที่ค่าของ readonly มักจะถูกกำหนดในระหว่างการรันไทม์ (runtime)

Example
public const string myConstString = "Hello, world!"; // Valid
public readonly string myReadonlyString = "Hello, world!"; // Valid

public const int myConstInt = Add(3, 4); // Invalid
public readonly int myReadonlyInt = Add(3, 4); // Valid

ใน code ตัวอย่างข้างต้นนี้ จะเห็นว่าตัวแปร const จะต้องถูกกำหนดค่าเริ่มต้นด้วย literal หรือค่านิพจน์แบบคงที่ (constant expression) แต่ตัวแปร readonly สามารถถูกกำหนดค่าได้ทั้งจาก literal หรือการเรียกใช้ method ตราบใดที่การกำหนดค่านั้นเกิดขึ้นในระหว่างการประกาศตัวแปรหรือภายใน constructor

2.ขอบเขตและตัวปรับการเข้าถึง (Scope and Access Modifiers)

เป็นอีกหนึ่งความแตกต่างที่สำคัญคือ ตัวแปร const จะต้องเป็น staticเสมอ และสามารถประกาศได้เฉพาะกับชนิดข้อมูลพื้นฐาน (basic types) เท่านั้น ในขณะที่ตัวแปร readonly สามารถเป็นได้ทั้งตัวแปรใน instance และตัวแปรแบบ static รวมถึงชนิดข้อมูลแบบอ้างอิง (reference types)

ตัวอย่างเช่น คุณไม่สามารถประกาศตัวแปร const แบบ private ได้ แต่คุณสามารถมีตัวแปร readonly แบบ private ได้

Example
public class MyClass
{
    public const int MyConst = 42;
    public readonly int MyReadonly = 42;
    public static readonly int MyStaticReadonly = 42;
}

public class Test
{
    public void TestMethod()
    {
        int x = MyClass.MyConst; // Accessing const field as a static member
        MyClass instance = new MyClass();
        int y = instance.MyReadonly; // Accessing readonly field as an instance member
        int z = MyClass.MyStaticReadonly; // Accessing static readonly field as a static member
    }
}

3.การจัดสรรหน่วยความจำ (Memory Allocation)

ในระหว่างการจัดสรรหน่วยความจำ ตัวแปร const จะถูกเก็บไว้ใน metadata ในขณะที่ค่าของ readonly จะถูกเก็บไว้ในหน่วยความจำ heap การใช้ตัวแปร readonly ยังช่วยให้สามารถจัดสรรหน่วยความจำแบบ lazy allocation ซึ่งอาจช่วยเพิ่มประสิทธิภาพในการทำงานของแอปพลิเคชัน C#

4.ข้อพิจารณาด้านประสิทธิภาพ (Performance Considerations)

เมื่อพิจารณาเลือกใช้ระหว่างค่าของ const และ readonly ประสิทธิภาพเป็นปัจจัยสำคัญ เนื่องจากค่าของ const ถูกกำหนดในช่วงเวลาคอมไพล์ การเข้าถึงตัวแปรเหล่านี้จึงเร็วกว่าเล็กน้อย ในทางกลับกัน ตัวแปร readonly ถูกกำหนดในช่วงเวลารันไทม์ ดังนั้นเวลาการเข้าถึงจะช้ากว่าเล็กน้อย

อย่างไรก็ตาม ความแตกต่างด้านประสิทธิภาพระหว่างตัวแปร const และ readonly มักจะเล็กน้อยจนแทบไม่ส่งผลในสถานการณ์ส่วนใหญ่ ดังนั้นคุณควรให้ความสำคัญกับการใช้คีย์เวิร์ดที่เหมาะสมตามปัจจัยอื่น ๆ เช่น การกำหนดค่าเริ่มต้นและข้อจำกัดด้านขอบเขต

สรุปโดยง่าย คือ

n
Readonly
Const
1

คีย์เวิร์ด readonly ใน C# ใช้สำหรับสร้างฟิลด์ที่เป็นแบบ readonly ไม่สามารถใช้กับตัวแปรท้องถิ่นได้

ฟิลด์ที่เป็นค่าคงที่ (constant) ถูกสร้างขึ้นด้วยคีย์เวิร์ด const ใน C# ใช้สำหรับประกาศฟิลด์หรือตัวแปรท้องถิ่นที่เป็นค่าคงที่

2

eadonly ถูกใช้ใน runtime

const ถูกใช้ในช่วง compile-time

3

readonly สามารถกำหนดได้ทั้งในช่วง runtime หรือในช่วงการกำหนดค่าเริ่มต้น (instance initialization)

ค่าของฟิลด์ const สามารถกำหนดได้เพียงครั้งเดียวในเวลาที่ประกาศ

4

ค่าในฟิลด์ที่เป็น readonly สามารถถูกเปลี่ยนแปลงได้ ในช่วง runtime ผ่าน constructor ที่ไม่ใช่ static

ค่าของฟิลด์ที่เป็น const เป็น static โดยปริยายและไม่สามารถเปลี่ยนแปลงได้ตลอดโปรแกรม

5

มีการจัดสรรหน่วยความจำให้กับฟิลด์ readonly อย่างไดนามิกในช่วง runtime

ไม่จำเป็นต้องมีการจัดสรรหน่วยความจำเพิ่มเติมสำหรับ const ในช่วง runtime

6

ไม่สามารถประกาศฟิลด์ readonly ภายใน method ได้

สามารถประกาศฟิลด์ const ภายใน method ได้

7

ฟิลด์ readonly สามารถใช้ร่วมกับชนิดอ้างอิง (reference type) ได้

ฟิลด์ const ไม่สามารถถูกส่งผ่านเป็นชนิดอ้างอิง (reference type)

9

ค่าของ readonly สามารถมีค่าแตกต่างกันได้ ขึ้นอยู่กับ constructor ที่ใช้

ค่าของ const จะคงที่ตลอดเวลา

10

สามารถใช้ร่วมกับตัวแก้ไข static ได้

ไม่สามารถใช้ร่วมกับตัวแก้ไข static ได้

ระหว่าง Readonly กับ Const ควรเลือกใช้ยังไงดี ?

ควรใช้ readonly ในกรณี:

  • ค่านั้นไม่สามารถกำหนดได้ในช่วงเวลาคอมไพล์ (compile time) แต่ไม่ควรเปลี่ยนแปลงหลังจากการกำหนดค่าเริ่มต้น

  • ต้องการตัวแปรใน instance หรือชนิดข้อมูลแบบอ้างอิงที่ไม่ควรถูกเปลี่ยนแปลงหลังจากการกำหนดค่า

  • ต้องการที่จะปิดกั้นโค้ดของคุณ และใช้การเข้าถึงแบบ private บนตัวแปร

คุณควรใช้ const ในกรณี:

  • ค่านั้นเป็นชนิดข้อมูลพื้นฐาน เช่น จำนวนเต็ม (integer) หรือลิเทอรัลแบบสตริง (string literal)

  • ต้องการกำหนดค่าที่ช่วงเวลาคอมไพล์ (compile time)

  • ค่านั้นไม่มีการเปลี่ยนแปลงตลอดการทำงานของแอปพลิเคชัน

  • ค่านั้นไม่ขึ้นอยู่กับการคำนวณในช่วงเวลารันไทม์ (runtime) หรือการเรียกใช้เมธอด

Slide and Presentation

Reference

  • Readonly

Pichid Detson. (8 มกราคม 2562). Const, Static และ Readonly ใน C#. medium. https://medium.com/@pichid/const-static-%E0%B9%81%E0%B8%A5%E0%B8%B0-readonly-%E0%B9%83%E0%B8%99-c-4b2e312c0dec

ไม่ปรากฎ. (18 มกราคม 2559). Const กับ Readonly. wk-j.github.iohttps://wk-j.github.io/2016/01/18/csharp-const-and-readonly/

Matthew Jones. (2558). Const vs Static vs Readonly in C#. exceptionnotfoundhttps://exceptionnotfound.net/const-vs-static-vs-readonly-in-c-sharp-applications/

ไม่ปรากฎ. (ม.ป.ป). Constants (the const keyword). csharp.net-tutorials. https://csharp.net-tutorials.com/th/407/classes/constants-the-const-keyword/#google_vignette

  • ความแตกต่างระหว่าง Readonly และ Const ใน C#

JavaTpoint. (ม.ป.ป). Difference between readonly and Constant in C#. javatpoint. https://www.javatpoint.com/difference-between-readonly-and-constant-in-c-sharp

ไม่ปรากฎ. (12 พฤษภาคม 2564). Difference between readonly and const keyword in C#. geeksforgeeks. https://www.geeksforgeeks.org/difference-between-readonly-and-const-keyword-in-c-sharp/

ไม่ปรากฎ. (21 พฤษภาคม 2564). Const vs Readonly in C#: Differences, Pros & Cons. bytehide. https://www.bytehide.com/blog/const-vs-readonly-in-c-explanation-in-3-minutes

Last updated