ใน C # ทั้งคีย์เวิร์ด const และ readonly ใช้เพื่อกำหนดค่าที่ไม่เปลี่ยนรูปแบบซึ่งไม่สามารถแก้ไขได้เมื่อประกาศแล้ว อย่างไรก็ตาม ทั้งสองมีความแตกต่างที่สำคัญบางประการ
คอนแทค
ตัวแก้ไข const ประกาศค่าคงที่ที่ทราบในเวลาคอมไพล์และไม่เปลี่ยนแปลง กล่าวคือ ค่าเหล่านี้ไม่เปลี่ยนรูป ใน C # คุณสามารถทำเครื่องหมายเฉพาะประเภทที่มีอยู่แล้วภายในเป็น const ประเภทที่กำหนดโดยผู้ใช้ เช่น คลาส โครงสร้าง ฯลฯ ไม่สามารถเป็นค่าคงที่ได้ นอกจากนี้ ประเภทของสมาชิกของคลาส เช่น เมธอด คุณสมบัติ หรือเหตุการณ์ไม่สามารถทำเครื่องหมายเป็นค่าคงที่ได้
คุณต้องเริ่มต้นค่าคงที่ในระหว่างการประกาศ
class Period{ public const int hours = 12; public const int minutes = 60; }
ค่าคงที่สามารถทำเครื่องหมายด้วยตัวปรับเปลี่ยนการมองเห็นได้ เช่น ส่วนตัว สาธารณะ การป้องกัน การป้องกันภายใน หรือการป้องกันส่วนตัว
ค่าคงที่ยังทำหน้าที่เป็นค่าคงที่ กล่าวคือ ค่าของค่าคงที่จะเหมือนกันในทุกอินสแตนซ์ของคลาส คุณไม่จำเป็นต้องทำเครื่องหมายด้วยคำหลักคงที่อย่างชัดเจน คุณไม่สามารถเข้าถึงค่าคงที่โดยใช้ตัวแปรอินสแตนซ์ของคลาสนั้น แต่ต้องใช้ชื่อคลาส
อ่านอย่างเดียว
ฟิลด์ที่ทำเครื่องหมายเป็นแบบอ่านอย่างเดียวสามารถกำหนดได้เฉพาะในระหว่างการประกาศหรือในตัวสร้าง เมื่อสร้างอินสแตนซ์ของคลาสแล้ว คุณจะไม่สามารถแก้ไขฟิลด์แบบอ่านอย่างเดียวได้
หากฟิลด์เป็นประเภทค่า การทำเครื่องหมายว่าเป็นแบบอ่านอย่างเดียวทำให้ไม่สามารถเปลี่ยนรูปแบบได้ ในทางกลับกัน หากฟิลด์แบบอ่านอย่างเดียวเป็นประเภทการอ้างอิง คุณยังสามารถเปลี่ยนข้อมูลของอ็อบเจ็กต์ที่อ้างอิงโดยตัวแปรได้ อย่างไรก็ตาม คุณไม่สามารถเปลี่ยนการอ้างอิงนั้นให้ชี้ไปที่วัตถุใหม่ได้
class Person{ private readonly string _title; private readonly string _skill; public Person(string title, string skill){ _title = title; _skill = skill; } }
ฟิลด์แบบอ่านอย่างเดียวสามารถกำหนดได้หลายครั้งในการประกาศฟิลด์และในตัวสร้างใดๆ นอกจากนี้ยังสามารถมีค่าที่แตกต่างกันขึ้นอยู่กับตัวสร้างที่ใช้
ความแตกต่างที่สำคัญระหว่างทั้งสองคือเมื่อมีการคอมไพล์ฟิลด์ const หรือแบบอ่านอย่างเดียวที่ประกาศในแอสเซมบลีหนึ่งเมื่อใช้ในแอสเซมบลีอื่น
-
ในกรณีของค่า const จะเหมือนกับ find-replace ค่าคงที่ 'อบ' เป็นภาษากลางของแอสเซมบลีที่สอง ซึ่งหมายความว่าหากคุณอัปเดตค่าคงที่ แอสเซมบลีที่สองจะยังคงมีค่าแรกอยู่จนกว่าคุณจะคอมไพล์ใหม่
-
ในกรณีของค่าแบบอ่านอย่างเดียว จะเหมือนกับการอ้างอิงถึงตำแหน่งหน่วยความจำ ค่านี้ไม่ได้รวมเข้ากับภาษากลางของแอสเซมบลีที่สอง ซึ่งหมายความว่าหากมีการอัพเดตตำแหน่งหน่วยความจำ แอสเซมบลีที่สองจะได้รับค่าใหม่โดยไม่ต้องคอมไพล์ใหม่ การอัปเดตฟิลด์แบบอ่านอย่างเดียวหมายความว่าจำเป็นต้องคอมไพล์แอสเซมบลีชุดแรกโดยไม่ต้องคอมไพล์แอสเซมบลีของผู้ใช้
ตัวอย่าง
using System; class Program{ static void Main(){ Console.WriteLine(Period.HOURS); var person = new Person("John", "Programmer"); person.Print(); } } class Period{ public const int HOURS = 12; public const int MINUTES = 60; } class Person{ private readonly string _title; private readonly string _skill; public Person(string title, string skill){ _title = title; _skill = skill; } public void Change(string skill){ // Error: A readonly field cannot be assigned to // this._skill = skill; } public void Print(){ Console.WriteLine($"{_title}: {_skill}"); } }
ผลลัพธ์
12 John: Programmer