2012-10-31 27 views
73

tôi đang cố gắng để khai báo một hằng số PI như thế này:Hằng số không thể được đánh dấu tĩnh

public static const double PI = Math.PI; 

nhưng tại sao tôi lại nhận được lỗi này?

The constant 'Calendar.NewCalendar.PI' cannot be marked static 
+1

Có thể trùng lặp http://stackoverflow.com/questions/408192/why-cant-i-have-public-static-const-string-s-stuff-in-my-class – himanshupareek66

Trả lời

156

const ngụ ý static (bạn không cần một cá thể để tham chiếu giá trị const).

Tôi cũng muốn thêm điểm quan trọng này: Khi bạn liên kết với (tham chiếu) một assembly với public const, giá trị đó là sao chép vào trong hội đồng của bạn. Vì vậy, nếu giá trị const trong các thay đổi lắp ráp tham chiếu, hội đồng của bạn sẽ vẫn có giá trị được biên dịch ban đầu.

Nếu hành vi này là không phải là có thể chấp nhận được, thì bạn nên cân nhắc tạo trường là trường public static readonly.

Lib.dll, với điều kiện như nhị phân:

public class Foo { 
    public const int HATS = 42; 
    public static readonly int GLOVES = 33; 
} 

App.exe, tài liệu tham khảo Lib.dll:

Foo.HATS // This will always be 42 even if the value in Lib.dll changes, 
      // unless App.exe is recompiled. 

Foo.GLOVES // This will always be the same as Foo.GLOVES in Lib.dll 

Từ MSDN:

Đừng tạo ra hằng số để thể hiện thông tin mà bạn mong muốn thay đổi bất cứ lúc nào. Ví dụ: không sử dụng trường cố định để lưu trữ giá dịch vụ, số phiên bản sản phẩm hoặc tên thương hiệu của công ty. Các giá trị này có thể thay đổi theo thời gian và vì các trình biên dịch truyền các hằng số, mã khác được biên dịch với các thư viện của bạn sẽ phải được biên dịch lại để xem các thay đổi.

Từ DotNetPerls:

DLL. Khi bạn sử dụng trường hoặc khai báo const, trình biên dịch C# thực sự nhúng giá trị của biến số const trực tiếp vào mã IL. Vì vậy, về cơ bản nó xóa const thành một thực thể riêng biệt.

Chú ý: Nếu các chương trình phụ thuộc vào một const không biên dịch lại sau khi thay đổi giá trị const, họ có thể phá vỡ [bởi vì họ sẽ tiếp tục sử dụng các giá trị trước đó].

9

Bạn không thể có const tĩnh. Hãy thử chỉ đọc thay vì const hoặc chỉ cần thả "tĩnh" vì "const" được ngụ ý tĩnh anyway.

10

Hằng số tĩnh theo định nghĩa.

+0

được áp dụng cho 'cuối cùng' trong java quá –

+0

@ BasheerAL-MOMANI: Không. Cuối cùng chỉ là không thể thay đổi sau khi gọi hàm tạo. Chỉ có bấy nhiêu thôi. –

+0

aha rồi 'cuối cùng' giống như 'chỉ đọc' ,,,, Tôi có đúng không? –

4

Không thể thay thế các hằng số trong mã trong khi biên dịch, không phải thời gian chạy, vì vậy không có yêu cầu đối với các định nghĩa ví dụ so với tĩnh.

2

Tất cả các khai báo hằng số là hoàn toàn tĩnh và thông số C# cho biết rằng việc thêm (dự phòng) của trình sửa đổi tĩnh bị cấm. Tôi tin rằng điều này là để tránh sự nhầm lẫn có thể xảy ra nếu người đọc nhìn thấy hai hằng số, một tuyên bố tĩnh và một không - họ có thể dễ dàng giả định rằng sự khác biệt trong đặc điểm kỹ thuật ngụ ý sự khác biệt trong ngữ nghĩa. Có nói rằng, không có cấm trên redundantly chỉ định một sửa đổi truy cập mà cũng là một mặc định, nơi có một sự lựa chọn. Ví dụ, một phương thức (cụ thể) có thể được đánh dấu rõ ràng là riêng tư mặc dù đó là mặc định. Quy tắc dường như là nơi không có lựa chọn nào (ví dụ: khai báo phương thức trong giao diện), công cụ sửa đổi dự phòng bị cấm. Nơi có sự lựa chọn, nó được cho phép.

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