Sự khác biệt giữa constant và readonly là gì?

{{FormatNumbertoThousand(model.total_like)}} lượt thích
612 lượt xem
C#/.Net middle

Ngoài sự khác biệt rõ ràng là

  • phải khai báo giá trị tại thời điểm định nghĩa cho một const so với các giá trị readonly có thể được tính toán động nhưng cần được gán trước khi phương thức khởi tạo thoát ra ... sau đó nó bị đóng băng (frozen).
  • const là hoàn toàn static. Bạn sử dụng ký hiệu ClassName.ConstantName để truy cập chúng.

còn có một sự khác biệt tinh tế, hãy xem xét lớp được định nghĩa trong AssemblyA.

public class Const_V_Readonly
{
   public const int I_CONST_VALUE = 2;
   public readonly int I_RO_VALUE;
   public Const_V_Readonly()
   {
      I_RO_VALUE = 3;
   }
}

AssemblyB tham chiếu đến AssemblyA và sử dụng các giá trị này trong mã. Khi điều này được biên dịch,

  • trong trường hợp của giá trị const, nó giống như một tìm kiếm thay thế (find-replace), giá trị 2 được 'đưa vào' IL của AssemblyB. Điều này có nghĩa là nếu ngày mai, chúng ta cập nhật I_CONST_VALUE trong AssemblyA thành 20, thì I_CONST_VALUE trong AssemblyB vẫn là 2 cho đến khi chúng ta biên dịch lại nó.
  • trong trường hợp của giá trị readonly, nó giống như một tham chiếu đến một vị trí bộ nhớ. Giá trị không được đưa vào IL của AssemblyB. Điều này có nghĩa là nếu vị trí bộ nhớ được cập nhật, AssemblyB sẽ nhận được giá trị mới mà không cần biên dịch lại. Vì vậy, nếu I_RO_VALUE được cập nhật thành 30, bạn chỉ cần build AssemblyA. Tất cả các client không cần phải được biên dịch lại.

Hãy nhớ rằng: Nếu bạn tham chiếu một const từ một assembly khác, giá trị của nó sẽ được biên dịch ngay trong assembly đang gọi. Bằng cách đó, khi bạn cập nhật const trong assembly được tham chiếu, nó sẽ không thay đổi trong assembly đang gọi!

{{login.error}}