Computer >> Máy Tính >  >> Lập trình >> C#

Giải thích sự khác biệt giữa từ khóa const và chỉ đọc trong C #

Trong C #, cả từ khóa const và readonly đều được sử dụng để xác định các giá trị bất biến không thể sửa đổi sau khi chúng được khai báo. Tuy nhiên, có một số khác biệt quan trọng giữa cả hai.

const

Công cụ sửa đổi const khai báo các giá trị hằng số đã biết tại thời điểm biên dịch và không thay đổi, tức là chúng không thay đổi. Trong C #, bạn chỉ có thể đánh dấu các kiểu dựng sẵn là const. Các kiểu do người dùng định nghĩa như lớp, cấu trúc, v.v. không thể là const. Ngoài ra, các kiểu thành viên của lớp như phương thức, thuộc tính hoặc sự kiện không thể được đánh dấu là hằng số.

Bạn phải khởi tạo các hằng trong khi khai báo.

class Period{
   public const int hours = 12;
   public const int minutes = 60;
}

Các hằng số có thể được đánh dấu bằng bất kỳ công cụ sửa đổi mức độ hiển thị nào, tức là riêng tư, công khai, được bảo vệ, được bảo vệ nội bộ hoặc được bảo vệ riêng tư.

Hằng số cũng hoạt động như các giá trị tĩnh, tức là giá trị của hằng số là như nhau đối với tất cả các trường hợp của lớp. Bạn không cần phải đánh dấu chúng một cách rõ ràng bằng từ khóa static. Bạn không thể truy cập các hằng bằng cách sử dụng các biến cá thể của lớp đó mà phải sử dụng tên lớp.

chỉ đọc

Trường được đánh dấu là chỉ đọc chỉ có thể được gán trong khi khai báo hoặc trong phương thức khởi tạo. Khi phiên bản của lớp được tạo, bạn không thể sửa đổi trường chỉ đọc.

Nếu trường là một loại giá trị, việc đánh dấu nó chỉ đọc sẽ làm cho nó bất biến. Mặt khác, nếu trường chỉ đọc là kiểu tham chiếu, thì bạn vẫn có thể thay đổi dữ liệu của đối tượng được tham chiếu bởi biến. Tuy nhiên, bạn không thể thay đổi tham chiếu đó để trỏ đến một đối tượng mới.

class Person{
   private readonly string _title;
   private readonly string _skill;
   public Person(string title, string skill){
      _title = title;
      _skill = skill;
   }
}

Một trường chỉ đọc có thể được gán nhiều lần trong khai báo trường và trong bất kỳ phương thức khởi tạo nào. Ngoài ra, nó có thể có các giá trị khác nhau tùy thuộc vào hàm tạo được sử dụng.

Một sự khác biệt quan trọng giữa hai trường này là khi một trường const hoặc chỉ đọc được khai báo trong một hợp ngữ được biên dịch khi được sử dụng trong một hợp ngữ khác.

  • Trong trường hợp giá trị const, nó giống như một tìm kiếm thay thế. Giá trị không đổi được 'đưa vào' ngôn ngữ trung gian của hợp ngữ thứ hai. Điều này có nghĩa là nếu bạn cập nhật hằng số, thì hợp ngữ thứ hai sẽ vẫn có giá trị đầu tiên cho đến khi bạn biên dịch lại nó.

  • Trong trường hợp giá trị chỉ đọc, nó giống như một tham chiếu đến một vị trí bộ nhớ. Giá trị không được đưa vào ngôn ngữ trung gian của hợp ngữ thứ hai. Điều này có nghĩa là nếu vị trí bộ nhớ được cập nhật, hợp ngữ thứ hai sẽ nhận giá trị mới mà không cần biên dịch lại. Cập nhật trường chỉ đọc có nghĩa là chỉ cần biên dịch hợp ngữ đầu tiên mà không cần bất kỳ hội đồng người dùng nào phải biên dịch.

Ví dụ

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}");
   }
}

Đầu ra

12
John: Programmer