2011-02-17 21 views
5

Tôi đang chơi xung quanh với sự phản chiếu và do tai nạn tôi nhận ra tôi có thể đặt thuộc tính trường tùy chỉnh trên biến lớp const, sau đó (sử dụng sự phản chiếu) tôi đọc các trường của lớp, tìm const với thuộc tính và thực hiện các hành động. Điều này làm việc tốt.Tại sao bạn có thể đọc một thuộc tính được đặt trên một const sử dụng sự phản chiếu trong C#?

Tôi tò mò là tại sao nó hoạt động tốt. Trừ khi tôi hiểu sai cách const làm việc, tôi nghĩ rằng các hằng số được "biên dịch" và tất cả các tham chiếu đến hằng số đó đã trở thành giá trị thực của hằng số sau khi biên dịch. Nếu đây là trường hợp, tại sao có thể phản ánh vẫn thấy giá trị const?

+2

OK, giả sử thế giới hoạt động theo cách bạn tưởng tượng. ** Làm thế nào sau đó bạn sẽ có thể sử dụng một giá trị không đổi được định nghĩa trong một hội đồng, nếu không có siêu dữ liệu cho hằng số được nhúng trong assembly? ** Đây không phải là một câu hỏi tu từ; Tôi thực sự quan tâm đến lý do tại sao mọi người tin những điều kỳ lạ về ngôn ngữ lập trình để chúng tôi có thể tạo các ngôn ngữ và tài liệu tốt hơn trong tương lai. –

+0

@Eric Lippert: Tôi cho rằng đó là vì các ngôn ngữ lập trình khác hoạt động theo cách đó, đặc biệt là những ngôn ngữ mà mọi người gặp phải trước đây. Tôi không bao giờ giả định các hằng số được biên dịch trong .NET, nhưng tôi không ngạc nhiên nếu ai đó đề cập đến chúng, bởi vì nó phù hợp với kiến ​​thức của tôi về ví dụ. Delphi hoặc C. Hơn nữa, như mọi người đã nói, một số điều về hằng số được biên dịch đi, và nó nhận thực hiện hơn nữa mà bạn đã thực hiện trước khi nó trở nên rõ ràng rằng bản thân hằng số không được gỡ bỏ khỏi hội đồng. – Stobor

Trả lời

11

Tất cả các tài liệu tham khảo đến const được biên dịch - không phải là tự khai báo const. Bất kỳ khai báo const nào được trình biên dịch phát ra như là một phần của IL.

Đây là một ví dụ (thông báo rằng IL giữ lại trường const).

C#:

class Foo 
{ 
    const int i = 0; 
} 

IL:

.class private auto ansi beforefieldinit Foo 
    extends [mscorlib]System.Object 
{ 
    .method public hidebysig specialname rtspecialname instance void .ctor() cil managed 
    { 
    } 


    .field private static literal int32 i = int32(0)  
} 
1

Tôi nghĩ hằng đã được "biên soạn ra" và tất cả các tài liệu tham khảo để liên tục đã trở thành giá trị thực tế của liên tục sau khi biên dịch. Nếu đây là trường hợp

Tôi có thể nói đây là không phải là trường hợp. A const vẫn là thành viên chính thức của lớp học. Hãy xem xét một thư viện cho thấy một số public const. Có thể thậm chí không có bất kỳ tham chiếu nào (trong chính thư viện) được 'biên soạn'.

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