Các hằng số trong C #


9

Tại sao trình biên dịch lưu trữ các giá trị không đổi trong siêu dữ liệu lắp ráp? Có phải chúng được nhúng trực tiếp vào mã Ngôn ngữ trung gian từ siêu dữ liệu lắp ráp?


1
điều này không thực sự giải quyết 'tại sao' nhưng dù sao cũng thú vị: stackoverflow.com/a/2128633/128384
stijn

Tôi bối rối trước câu hỏi này. Nơi nào khác chúng sẽ được lưu trữ nếu không có trong siêu dữ liệu? Bạn có thể làm rõ câu hỏi?
Eric Lippert

Câu trả lời:


4

Cách tốt nhất để suy nghĩ về nó tôi tìm thấy là: Tại thời điểm biên dịch, một const được chuyển đổi thành một nghĩa đen nơi nó được sử dụng.

Lý do duy nhất nó đi vào bảng kê khai trong hội đồng mà nó được xác định là để làm cho nó có thể truy cập được cho người tiêu dùng. Nó là một phần của một loại nhất định và siêu dữ liệu của loại đó được lưu trữ trong tập hợp của nó, chứ không phải các tập hợp tiêu thụ nó.

Vì vậy, nó là một nghĩa đen trong tiêu dùng và một loại tài sản hoặc trường đóng gói có thể tiêu thụ trong siêu dữ liệu.


2

Tôi đã tự nghiên cứu trong một thời gian khá dài và tìm thấy từ một cuốn sách rằng đây có thể là lý do ...

Vì các giá trị không đổi không bao giờ thay đổi, các hằng số được coi là một phần của kiểu xác định. Do đó, việc xác định các hằng số tạo ra siêu dữ liệu.


1

Tôi nghĩ rằng bạn trộn lẫn hai hội đồng.

Hằng số chỉ được lưu trữ trong siêu dữ liệu trong tổ hợp nơi nó được xác định . Siêu dữ liệu chứa thông tin về tất cả các loại và thành viên trong một cụm và hằng số là thành viên.

Không có thông tin về hằng số được lưu trữ trong tổ hợp nơi nó được sử dụng . Giá trị không đổi được sử dụng trực tiếp trong IL giống như bạn đã viết số hoặc chuỗi không đổi trực tiếp trong nguồn.

Một ví dụ: Một trong những ứng dụng của tôi sử dụng rất nhiều hằng số để xác định các bảng và trường cơ sở dữ liệu. Tôi có một hội đồng chỉ chứa tất cả các hằng số.

Khi tôi xây dựng ứng dụng, tôi thêm một tham chiếu đến cụm "hằng" trong Visual Studio. Vì lắp ráp chỉ chứa các hằng số nên không có tham chiếu đến nó trong ứng dụng của tôi và lắp ráp "hằng số" là không cần thiết trong thời gian chạy.


2
Điều này không thực sự giải thích tại sao các hằng được lưu trữ trong siêu dữ liệu. Nó nhảy xung quanh tại sao, nhưng tôi không nghĩ OP đang nhầm lẫn hai hội đồng. Bạn thấy đó là một vấn đề hai hội đồng vì bạn sử dụng hai hội đồng, nhưng tôi không nghĩ rằng thực tế là phổ biến; các hằng số thường được định nghĩa trong cùng một cụm nơi chúng được sử dụng.
Robert Harvey

@RobertHarvey Giả định của bạn về trường hợp điển hình đánh giá quá cao kỹ năng của nhiều đồng nghiệp C # enterprisey của chúng tôi, tôi đã nhiều lần phải giải thích một const là gì với các đồng nghiệp và tại sao bạn không gọi họ qua các hội đồng.
Jimmy Hoffa

1

Các hằng số được biết đến tại thời điểm biên dịch và sau đó chúng được lưu trữ trong siêu dữ liệu của lắp ráp. Điều này có nghĩa là bạn chỉ có thể xác định các hằng số cho các kiểu nguyên thủy.

Có, chúng được tải trực tiếp từ siêu dữ liệu. Sẽ không có phân bổ bộ nhớ trong thời gian chạy.


1
Số thập phân không phải là kiểu nguyên thủy nhưng bạn có thể tạo hằng số thập phân. Và bạn có thể tạo các hằng số thuộc bất kỳ loại tham chiếu nào với điều kiện là hằng số là null.
Eric Lippert
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.