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).
Nguồn
2017-05-30 10:28:22
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 đó. –
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
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