2017-05-29 22 views
6

Làm cách nào có thể?Tại sao có thể truy cập trường const tư nhân từ thuộc tính?

namespace test 
    { 
     class Attr:Attribute 
     { 
      public Attr(int e) 
      { 
      } 
     } 

     [Attr(E)] 
     class Test 
     { 
      private const int E = 0; 
     } 
    } 

Không vi phạm nguyên tắc đóng gói?

+6

Thuộc tính 'Attr' là thành viên của lớp' Kiểm tra'. Một thành viên của một lớp có quyền truy cập vào các trường riêng của lớp đó. –

+0

Bạn chuyển giá trị trường riêng vào ctor của một lớp khác. Điều này phải làm gì với việc đóng gói bẻ khóa? Đặc biệt là khi bạn vượt qua trong loại giá trị. – Karolis

+0

Tôi có thể đọc nó hoạt động ở đâu? Bạn có thể cung cấp một số liên kết không? – Vahe

Trả lời

3

Không, điều này không vi phạm đóng gói. Khai báo thuộc tính là một phần logic của lớp. Attr không truy cập được Test.E (không thể), bạn đang gọi hàm tạo của Attr với E từ trong vòng Test. Điều này cũng tốt như thể bạn đang khởi tạo một thành viên.

Cú pháp C# có thể làm cho nó trông giống như thuộc tính là "bên ngoài" lớp bằng cách nào đó, nhưng đây không phải là trường hợp. Các IL sản xuất cho lớp này là thế này:

.class private auto ansi beforefieldinit test.Test 
    extends [mscorlib]System.Object 
{ 
    .custom instance void test.Attr::.ctor(int32) = (
     01 00 00 00 00 00 00 00 
    ) 
    // Fields 
    .field private static literal int32 E = int32(0) 

    ... 

} // end of class test.Test 

Đã C# thông qua một cú pháp tương tự, nó có thể đã xem xét một cái gì đó như thế này:

class Test 
    { 
     attribute Attr(E); 

     private const int E = 0; 
    } 

này sẽ nhấn mạnh phạm vi của việc kê khai, nhưng nó cho là không rõ ràng. Nó trở nên thậm chí còn ít rõ ràng hơn khi các thuộc tính được áp dụng cho các thành viên (trong IL, những điều này trực tiếp tuân theo việc khai báo).

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