'const string' so với 'static readonly string' trong C #


Câu trả lời:


171

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ế.


25
+1, Và kết luận rõ ràng, từ một cái nhìn điểm-of-thực tiễn và ngữ nghĩa: 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.
LukeH

3
@LukeH không bao giờ, bao giờ, mạnh mẽ một chút. Tôi không thể nghĩ về bất cứ điều gì xấu sẽ xảy ra nếu người ta khai báo một chuỗi riêng tư là const và thay đổi nó giữa hai sự kiện biên dịch lại.
Brenda Bell,

5
@Brenda: Tôi thừa nhận rằng tôi sử dụng 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ả. ;)
LukeH

Điều gì về hiệu suất trong trường hợp chuỗi nói riêng? Mỗi lần sử dụng const sẽ tạo ra một bản sao mới của một chuỗi trong bộ nhớ?
Andrii

@Andrii không, chuỗi hằng được tạo một lần. Mỗi cách sử dụng sẽ có cùng một tham chiếu trong bộ nhớ.
Migg

43

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ố.


19
Điểm rất thú vị từ bài báo - "Ở cấp độ cao, các hằng số rõ ràng được xử lý tại thời điểm biên dịch, trong khi các trường chỉ đọc tĩnh được đặt tại thời điểm chúng được đánh giá tại thời điểm chạy. Thực tế là các giá trị hằng số được thay thế bởi trình biên dịch có nghĩa là bất kỳ thư viện / hợp ngữ nào tham chiếu đến giá trị không đổi sẽ cần được biên dịch lại nếu giá trị không đổi thay đổi. Các thư viện tham chiếu đến trường static readonly sẽ tham chiếu đến trường chứ không phải giá trị, do đó chúng sẽ nhận bất kỳ thay đổi nào trong trường mà không cần để biên dịch lại "
s_hewitt

1
Vâng, tôi cũng đã đọc nó và có một chút thời gian. Tôi chắc chắn không biết điều đó.
spinon

Đây là phiên bản được lưu trong bộ nhớ cache của Google: webcache.googleusercontent.com/…
spinon

2
Liên kết tham chiếu không còn khả dụng.
Salomon Zhang

Đây là một lời khen tuyệt vời cho câu trả lời được đánh dấu là giải pháp. Xác định cách sử dụng là rất hữu ích. +1 từ tôi.
Bonez024,

11

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.


6

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 nói đến "OQ" này là ai?
Peter Mortensen

“Câu hỏi ban đầu”
Ben Aston

0

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.


2
Tôi không biết làm thế nào điều này thêm bất cứ điều gì ngoài những gì các câu trả lời hiện có đã nói.
Vụ kiện của Fund Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.