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 constchuỗ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 constgiá 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 readonlychuỗ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 readonlychuỗ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.UserNamehoặc DateTime.Now.ToString(). Một constchuỗ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 readonlychuỗi có thể được đặt trong một hàm tạo tĩnh; một constchuỗi chỉ có thể được khởi tạo nội tuyến.
Lưu ý rằng a static stringcó thể được sửa đổi; bạn nên sử dụng static readonlythay thế.
constchỉ 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 constcho 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 constcho 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ố.
constpublic 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 readonlypublic 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 stringvs 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 constcá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 readonlyvs const, thì tôi khuyên bạn nên static readonlydù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 stringchỉ trong hàm statictạ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 constchuỗi ở bất kỳ đâu.