Difference between readonly and const keyword
กิติยา ผ่องแผ้ว 650710528
Const คืออะไร ?
ค่าคงที่ (Constants) เป็นการอ้างถึงข้อมูลเช่นเดียวกับ ตัวแปร (Variable) สิ่งที่แตกต่างคือ ค่าของมันไม่สามารถเปลี่ยนแปลงได้อีก หลังจากการประกาศในภาษา C# ค่าคงที่จะต้องถูกประกาศโดยระบุชนิดของข้อมูล ค่าตั้งต้น และ ต้องระบุคีย์เวิร์ด const
ในการประกาศค่าคงที่ก่อนถูกนำมาใช้งานเสมอ
การประกาศค่าคงที่ในภาษา C# มีรูปแบบดังนี้
ตัวอย่างการใช้
เพราะว่าค่าคงที่แบบ const
จะไม่มีทางเปลี่ยนแปลง มันจึงถูก define เป็นส่วนหนึ่งของ type แบบ static member ไม่ใช่ instance member เหมือน field ทั่วไป และเมื่อมีการอ้างอิง const
ณ ส่วนใดของโค้ด compiler จะดึงค่าที่ผูกไว้ไปฝังไว้ใน IL ทำให้ขณะรันโปรแกรมไม่จำเป็นต้อง allocate memory
Readonly คืออะไร ?
C# มี keyword readonly
สำหรับกำหนดค่าคงที่แบบ runtime constant ถูกสร้างมาเพื่อป้องกันไม่ให้มีการเปลี่ยนค่าตัวแปร แต่สามารถกำหนดค่าผ่าน constructor ได้อย่างเดียว และ readonly
สามารถใช้ได้กับ reference type ทั้งยังสามารถย้ายการกำหนดค่ามาไว้ใน constructure ได้
ตัวอย่างการใช้
ในตัวอย่างข้างต้น แสดงให้เห็นว่าตัวแปรสามารถมีค่าต่างกันได้สำหรับ constructors ที่แตกต่างกันใน class เดียวกัน
ในตัวอย่างที่ 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)
ใน 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
ได้
3.การจัดสรรหน่วยความจำ (Memory Allocation)
ในระหว่างการจัดสรรหน่วยความจำ ตัวแปร const
จะถูกเก็บไว้ใน metadata ในขณะที่ค่าของ readonly
จะถูกเก็บไว้ในหน่วยความจำ heap การใช้ตัวแปร readonly
ยังช่วยให้สามารถจัดสรรหน่วยความจำแบบ lazy allocation ซึ่งอาจช่วยเพิ่มประสิทธิภาพในการทำงานของแอปพลิเคชัน C#
4.ข้อพิจารณาด้านประสิทธิภาพ (Performance Considerations)
เมื่อพิจารณาเลือกใช้ระหว่างค่าของ const
และ readonly
ประสิทธิภาพเป็นปัจจัยสำคัญ เนื่องจากค่าของ const
ถูกกำหนดในช่วงเวลาคอมไพล์ การเข้าถึงตัวแปรเหล่านี้จึงเร็วกว่าเล็กน้อย ในทางกลับกัน ตัวแปร readonly
ถูกกำหนดในช่วงเวลารันไทม์ ดังนั้นเวลาการเข้าถึงจะช้ากว่าเล็กน้อย
อย่างไรก็ตาม ความแตกต่างด้านประสิทธิภาพระหว่างตัวแปร const
และ readonly
มักจะเล็กน้อยจนแทบไม่ส่งผลในสถานการณ์ส่วนใหญ่ ดังนั้นคุณควรให้ความสำคัญกับการใช้คีย์เวิร์ดที่เหมาะสมตามปัจจัยอื่น ๆ เช่น การกำหนดค่าเริ่มต้นและข้อจำกัดด้านขอบเขต
สรุปโดยง่าย คือ
คีย์เวิร์ด readonly
ใน C# ใช้สำหรับสร้างฟิลด์ที่เป็นแบบ readonly ไม่สามารถใช้กับตัวแปรท้องถิ่นได้
ฟิลด์ที่เป็นค่าคงที่ (constant) ถูกสร้างขึ้นด้วยคีย์เวิร์ด const
ใน C# ใช้สำหรับประกาศฟิลด์หรือตัวแปรท้องถิ่นที่เป็นค่าคงที่
eadonly
ถูกใช้ใน runtime
const
ถูกใช้ในช่วง compile-time
readonly
สามารถกำหนดได้ทั้งในช่วง runtime หรือในช่วงการกำหนดค่าเริ่มต้น (instance initialization)
ค่าของฟิลด์ const
สามารถกำหนดได้เพียงครั้งเดียวในเวลาที่ประกาศ
ค่าในฟิลด์ที่เป็น readonly
สามารถถูกเปลี่ยนแปลงได้ ในช่วง runtime ผ่าน constructor ที่ไม่ใช่ static
ค่าของฟิลด์ที่เป็น const
เป็น static โดยปริยายและไม่สามารถเปลี่ยนแปลงได้ตลอดโปรแกรม
มีการจัดสรรหน่วยความจำให้กับฟิลด์ readonly
อย่างไดนามิกในช่วง runtime
ไม่จำเป็นต้องมีการจัดสรรหน่วยความจำเพิ่มเติมสำหรับ const
ในช่วง runtime
ไม่สามารถประกาศฟิลด์ readonly
ภายใน method ได้
สามารถประกาศฟิลด์ const
ภายใน method ได้
ฟิลด์ readonly
สามารถใช้ร่วมกับชนิดอ้างอิง (reference type) ได้
ฟิลด์ const
ไม่สามารถถูกส่งผ่านเป็นชนิดอ้างอิง (reference type)
ค่าของ readonly
สามารถมีค่าแตกต่างกันได้ ขึ้นอยู่กับ constructor ที่ใช้
ค่าของ const
จะคงที่ตลอดเวลา
สามารถใช้ร่วมกับตัวแก้ไข 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