2009-02-17 37 views
24

Const được nướng vào mã máy khách. Readonly thì không. Nhưng const nhanh hơn. Có thể chỉ hơi mặc dù.Khi nào, nếu bao giờ, chúng ta nên sử dụng const?

Câu hỏi đặt ra là, có bao giờ xảy ra bất kỳ tình huống nào bạn thích const trên readonly không? Hoặc để nói lại, chúng tôi có thực tế không luôn luôn sử dụng tốt hơn khi sử dụng một số readonly thay vì một số const (ghi nhớ điều nướng nói trên)?

Trả lời

28

Tôi tin rằng thời gian duy nhất "const" là thích hợp là khi có một thông số kỹ thuật mà bạn đang mã hóa dựa trên đó là bền hơn so với chương trình bạn đang viết. Ví dụ, nếu bạn đang triển khai giao thức HTTP, có một thành viên const cho "GET" là thích hợp bởi vì điều đó sẽ không bao giờ thay đổi, và khách hàng chắc chắn có thể mã hóa nó vào các ứng dụng đã biên dịch của họ mà không cần phải thay đổi giá trị sau.

Nếu có bất kỳ cơ hội nào bạn cần thay đổi giá trị trong các phiên bản sau, không sử dụng const.

Oh! Và không bao giờ cho rằng const là nhanh hơn một lĩnh vực chỉ đọc, trừ khi bạn đã đo nó. Có tối ưu hóa JIT mà có thể làm cho nó để nó thực sự giống hệt nhau.

+1

"Nếu có bất kỳ cơ hội nào bạn cần thay đổi giá trị trong các phiên bản sau, đừng sử dụng const." Tôi không theo logic của bạn. Một phần của điểm của một hằng số là bạn có thể thay đổi nó trong một phiên bản tương lai. – Powerlord

+14

Nếu một hằng số là công khai hơn "nội bộ" (hoặc nếu nó chỉ là nội bộ nhưng bạn có InternalsVisibleTo), sau đó IL trình biên dịch được phép sao chép giá trị không đổi tham chiếu hội đồng. Điều này có nghĩa là nếu bạn phát hành phiên bản mới và thay đổi hằng số, bạn hiện không đồng bộ với người tiêu dùng của mình. –

+1

@AndrewArnott Cảm ơn vì bài làm rõ cuối cùng, tôi dám nói đó là một điểm khá quan trọng! – AgentKnopf

0

Bạn nên sử dụng const bất cứ khi nào bạn có thể đặt giá trị trong khai báo và không phải chờ hàm tạo.

3

chỉ đọc là hữu ích khi khởi tạo không thẳng về phía trước.
const có thể được sử dụng khi bạn chắc chắn về giá trị trước khi được biên dịch.

Trong một cách, chỉ đọc là một thời gian chạy const & const là một giá trị hằng số thời gian biên dịch.

EDIT: Nếu bạn nhìn vào một số mã bằng cách sử dụng www.koders.com, bạn sẽ thấy rằng có một sử dụng chỉ đọc nơi const có thể đã được sử dụng. Tôi nghĩ, lý do đằng sau đó có thể là nó có thể sửa đổi được trong hàm tạo (nếu cần). Trong trường hợp của const (đặc biệt là công khai), bạn có cơ hội phá vỡ mã máy khách phụ thuộc vào mã của bạn.

4

Bạn có thể sử dụng giá trị const làm trường hợp trong câu lệnh chuyển đổi, fwiw.

2

const không thể được sử dụng cho các lớp hoặc cấu trúc (ngoại trừ chuỗi hằng số và null, như ông Skeet đã chỉ ra), chỉ cho các loại giá trị và được truy nhập dưới dạng trường tĩnh. Giá trị của một const được đặt tại thời gian biên dịch và phải được đặt khi nó được khai báo.

Chỉ đọc có thể được sử dụng cho bất kỳ điều gì ngoại trừ các liệt kê và có thể là trường tĩnh hoặc trường mẫu. Giá trị của chỉ đọc được đặt ở thời gian chạy và có thể được đặt khác nhau tùy thuộc vào hàm tạo nào được gọi.

Here's a good page để biết tổng quan về các từ khóa const, chỉ đọc và tĩnh.

+0

Phẳng không chính xác. Tôi nghĩ bạn đã nhầm lẫn ngôn ngữ của mình - đây là C++. – Arafangion

+0

Sai lầm của tôi, bằng cách nào đó, tôi nghĩ đây là C++. Dường như * I * trộn lẫn các ngôn ngữ của tôi ... – Arafangion

+1

const có thể được sử dụng với các kiểu tham chiếu - nó chỉ là hằng số kiểu tham chiếu duy nhất là hằng số chuỗi và null. –

15

Const vs readonly:

Một tóm tắt nhanh về sự khác biệt giữa 'const' và 'readonly' trong C#: 'const':

  • Không thể tĩnh.
  • Giá trị được đánh giá tại thời gian biên dịch.
  • Chỉ được khai báo khi khai báo.

'readonly':

  • Có thể là ví dụ cấp hoặc tĩnh.
  • Giá trị được đánh giá tại thời gian chạy.
  • Có thể được khởi tạo trong khai báo hoặc bằng mã trong hàm tạo.

Correction: các bang const trên không thể được tĩnh. Đó là một sự nhầm lẫn. Họ không thể có từ khóa tĩnh được áp dụng vì chúng đã là tĩnh.

Vì vậy, bạn sử dụng const cho các mục tĩnh mà bạn muốn được đánh giá tại thời gian biên dịch.

+2

consts chỉ là tĩnh, họ không thể sử dụng các từ khóa tĩnh vì nó sẽ là dư thừa – Logan5

+3

Không thể tĩnh? Đó không phải là vì nó là _always_ tĩnh? – Svish

+0

Tôi nghĩ rằng tốt hơn là thay đổi tuyên bố ban đầu của bạn, hơn là thêm "sửa" vào dưới cùng –

0

Sử dụng tốt const là cho khóa của cặp khóa/giá trị. Ví dụ: nếu bạn vẫn đang sử dụng AppSetting (thay vì ApplicationSettings), nó không thực sự hợp lý để tải tên của khóa vào cài đặt cấu hình. Nếu nó được sử dụng ở một vài nơi, hãy bấm phím trong một chòm sao.

1

Bạn nên sử dụng công cụ sửa đổi được kiểm tra tại thời gian biên dịch trên công cụ sửa đổi được kiểm tra trong thời gian chạy (trong ngữ cảnh này const over readonly). Và bạn nên luôn sử dụng các công cụ sửa đổi hỗ trợ ngữ nghĩa bạn cần. Nếu một cái gì đó không có nghĩa là để được sửa đổi - bảo vệ nó hoặc ai đó sẽ viết một cái gì đó cho nó (do tai nạn hoặc do sự thiếu hiểu biết).

3

Tôi thường chỉ sử dụng const cho những thứ tôi biết sẽ không bao giờ thay đổi thay đổi như nhiệt độ đóng băng.

Tôi thích chỉ đọc cho những thứ có thể khả năng thay đổi. Bằng cách này tôi chỉ cần biên dịch lại một dll nếu thay đổi xảy ra. Một ngoại lệ cho quy tắc này là nếu biến là riêng tư/được bảo vệ/thân thiện với hội đồng của riêng nó. Trong những trường hợp đó là an toàn để sử dụng const.

+2

Một tuyên bố nguy hiểm - nhiệt độ môi trường chúng ta đóng băng ở đâu? : D – Gusdor

Các vấn đề liên quan