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