Constant
ค่าคงที่แบบ compile time constant ใน C# สามารถประกาศด้วย keyword const ซึ่งจะใช้ได้กับ data ประเภท primitive type ดังต่อไปนี้ เท่านั้น
1 | Boolean, Char, Byte, SByte, Int16, UInt16, |
ค่าคงที่แบบ const จะไม่มีทางเปลี่ยนแปลง มันจึงถูก define เป็นส่วนหนึ่งของ type แบบ static member ไม่ใช่ instance member เหมือน field ทั่วไป
เมื่อมีการอ้างอิง const ณ ส่วนใดของโค้ด compiler จะดึงค่าที่ผูกไว้ไปฝั่งไว้ใน IL ทำให้ขณะรันโปรแกรมไม่จำเป็นต้อง allocate memory
ข้อจำกัดของ constant เพื่อเทียบกับ field
- ไม่สามารถหาค่า address ของ constant ได้
- ไม่สามารถส่งค่า
constแบบ pass by reference ผ่าน keywordref - ในกรณีที่มีการเปลี่ยนค่า
constใน assembly ที่อ้างอิง จำเป็น ต้อง compile โปรแกรมใหม่
ตัวอย่าง
1 | using System; |
จากตัวอย่าง มีการประกาศตัวแปรแบบ static ชื่อ _version และมีค่า constant ชื่อ ProductName
1 | .method public hidebysig static |
เมื่อ compile เป็นคำสั่ง IL จะพบความแตกต่างระหว่างตัวแปรแบบ static ธรรมดากับค่า static const ดังนี้
- บรรทัดที่ 17 จะเห็นว่าตำแหน่งที่อ้างถึง ค่า
constมีการฝั่งค่า string literalVisual C#ไว้เลย - บรรทัดที่ 19 ตำแหน่งตัวแปรแบบ
staticยังมีการอ้างอิงไปยัง ชื่อตัวแปรโดยใช้คำสั่งldsfld string Program::_versionอยู่
Readonly
C# มี keyword readonly สำหรับกำหนดค่าคงที่แบบ runtime constant จะต่างจาก const คือ readonly สามารถใช้ได้กับ reference type และสามารถย้ายการกำหนดค่ามาไว้ใน constructure ได้
ตัวอย่าง
1 | public class Cat { |
จากตัวอย่างเราสามารถกำหนดค่า constant แบบ readonly ได้ใน constructure หรือกำหนดค่าบรรทัดเดียวกับการประกาศชื่อตัวแปรก็ได้
readonly ต่างจาก const อย่างไร
- สามารถใช้กับ reference type
- ค่าคงที่แบบ
readonlyจะถูก evaluate ขณะรัน จึงไม่มีปัญหา cross-assembly versioning เหมือนconst readonlyไม่จำเป็นต้องเป็นstatic- แต่ละ instance ของคลาสสามารถมีค่าต่างกันได้ เพราะสามารถกำหนดค่าผ่าน constructure