Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

อธิบายความแตกต่างระหว่างคำสำคัญ const และแบบอ่านอย่างเดียวใน C #


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