Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Sự khác biệt giữa const và readonly trong C#

Cả const và readonly đều dùng để định nghĩa giá trị bất biến (immutable) không thể sửa đổi sau khai báo. Tuy nhiên có khác biệt quan trọng.

const

const khai báo hằng số biết tại compile-time, không thay đổi. Chỉ áp dụng cho kiểu built-in (int, string, double...). Kiểu tự định nghĩa (class, struct) không được const. Member như method, property, event không thể const.

Phải khởi tạo ngay khi khai báo:

class Period
{
    public const int Hours = 12;
    public const int Minutes = 60;
}

const có thể có mọi access modifier (public, private, protected...). const ngầm là static - giá trị giống nhau cho mọi instance. Truy xuất qua tên lớp: Period.Hours.

readonly

readonly chỉ được gán tại khai báo hoặc trong constructor. Sau khi instance tạo xong, không sửa đổi field readonly.

Nếu field là kiểu giá trị → immutable. Nếu kiểu tham chiếu → vẫn có thể sửa đổi dữ liệu object được tham chiếu, nhưng không thể gán reference mới.

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

readonly có thể gán nhiều lần (khai báo + các constructor). Giá trị có thể khác nhau tùy constructor.

Khác biệt quan trọng: Biên dịch cross-assembly

  • const: Giá trị được "nướng" (baked) vào IL của assembly tham chiếu. Cập nhật const → assembly tham chiếu vẫn giữ giá trị cũ cho đến khi recompile.
  • readonly: Giống tham chiếu đến vị trí bộ nhớ. Cập nhật readonly → assembly tham chiếu nhận giá trị mới mà không cần recompile. Chỉ cần recompile assembly định nghĩa.

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)
    {
        // Lỗi compile: A readonly field cannot be assigned to
        // this._skill = skill;
    }
    public void Print()
    {
        Console.WriteLine($"{_title}: {_skill}");
    }
}

Kết quả đầu ra

12
John: Programmer