Trong C #, sự khác biệt giữa
static readonly string MyStr;
và
const string MyStr;
?
Trong C #, sự khác biệt giữa
static readonly string MyStr;
và
const string MyStr;
?
Câu trả lời:
Khi bạn sử dụng một const
chuỗi, trình biên dịch sẽ nhúng giá trị của chuỗi vào thời gian biên dịch .
Do đó, nếu bạn sử dụng một const
giá trị trong một assembly khác, sau đó cập nhật assembly gốc và thay đổi giá trị, thì assembly khác sẽ không thấy thay đổi cho đến khi bạn biên dịch lại nó.
Một static readonly
chuỗi là một lĩnh vực bình thường mà được nhìn lên khi chạy. Do đó, nếu giá trị của trường bị thay đổi trong một assembly khác, các thay đổi sẽ được nhìn thấy ngay sau khi assembly được tải mà không cần biên dịch lại.
Điều này cũng có nghĩa là một static readonly
chuỗi có thể sử dụng các thành viên không phải là hằng số, chẳng hạn như Environment.UserName
hoặc DateTime.Now.ToString()
. Một const
chuỗi chỉ có thể được khởi tạo bằng các hằng số hoặc ký tự khác.
Ngoài ra, một static readonly
chuỗi có thể được đặt trong một hàm tạo tĩnh; một const
chuỗi chỉ có thể được khởi tạo nội tuyến.
Lưu ý rằng a static string
có thể được sửa đổi; bạn nên sử dụng static readonly
thay thế.
const
chỉ nên được sử dụng cho các hằng - hằng số là giá trị mà không bao giờ , bao giờ , bao giờ thay đổi.
private const
cho các giá trị không phải là hằng số, nói đúng ra là; về cơ bản nó đang lạm dụng const
cho các mục đích tối ưu hóa vi mô. Tôi sẽ đứng trước câu nói "không bao giờ, mãi mãi, không bao giờ" của mình, ngay cả khi nó khiến tôi trở thành kẻ đạo đức giả. ;)
Dưới đây là bảng phân tích ưu và nhược điểm :
Vì vậy, có vẻ như hằng số nên được sử dụng khi rất ít khả năng giá trị sẽ thay đổi hoặc nếu không có ứng dụng / lib bên ngoài nào sử dụng hằng số. Các trường chỉ đọc tĩnh nên được sử dụng khi cần tính toán thời gian chạy hoặc nếu người tiêu dùng bên ngoài là một nhân tố.
const
public const string MyStr;
là một hằng số thời gian biên dịch (bạn có thể sử dụng nó làm tham số mặc định cho một tham số phương thức chẳng hạn) và nó sẽ không bị xáo trộn nếu bạn sử dụng công nghệ như vậy
static readonly
public static readonly string MyStr;
là hằng số thời gian chạy . Nó có nghĩa là nó được đánh giá khi ứng dụng được khởi chạy chứ không phải trước đó. Đây là lý do tại sao nó không thể được sử dụng làm tham số mặc định cho một phương thức (lỗi biên dịch) chẳng hạn. Giá trị được lưu trữ trong nó có thể bị xáo trộn.
OQ hỏi về static string
vs const
. Cả hai đều có các trường hợp sử dụng khác nhau (mặc dù cả hai đều được coi là tĩnh).
Chỉ sử dụng const cho các giá trị thực sự không đổi (ví dụ: tốc độ ánh sáng - nhưng ngay cả điều này cũng thay đổi tùy theo phương tiện). Lý do cho hướng dẫn nghiêm ngặt này là giá trị const được thay thế vào việc sử dụng const trong các hội đồng tham chiếu đến nó, có nghĩa là bạn có thể gặp vấn đề về lập phiên bản nếu const thay đổi ở vị trí định nghĩa của nó (nghĩa là nó không nên là một hằng số sau cùng). Lưu ý rằng điều này thậm chí ảnh hưởng đến private const
các trường vì bạn có thể có lớp cơ sở và lớp con trong các tập hợp khác nhau và các trường riêng tư được kế thừa .
Trường tĩnh được gắn với kiểu chúng được khai báo bên trong. Chúng được sử dụng để biểu diễn các giá trị cần phải giống nhau cho tất cả các trường hợp của một loại nhất định. Các trường này có thể được ghi vào bao nhiêu lần tùy thích (trừ khi được chỉ định chỉ đọc).
Nếu ý bạn là static readonly
vs const
, thì tôi khuyên bạn nên static readonly
dùng cho hầu hết mọi trường hợp vì nó là bằng chứng trong tương lai nhiều hơn.
Bạn có thể thay đổi giá trị của một static readonly string
chỉ trong hàm static
tạo của lớp hoặc bộ khởi tạo biến, trong khi bạn không thể thay đổi giá trị của một const
chuỗi ở bất kỳ đâu.