ใน 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