2014-12-20 13 views
8

Tôi biết những lợi thế của việc sử dụng các thuộc tính trên các trường, như có thể cung cấp logic bổ sung khi được yêu cầu trong tương lai.Tại sao chúng ta không thể sử dụng các trường công khai để ràng buộc dữ liệu trong C#?

Nhưng tôi thực sự băn khoăn tại sao không thể sử dụng các trường công khai để ràng buộc dữ liệu hoặc thậm chí đối với các trình nối tiếp JSON như lớp JavaScriptSerializer.

Có lý do chính đáng nào để bỏ qua các trường công khai trong những trường hợp này không? Hay nó chỉ là một loại quy ước nào đó? Hoặc chỉ để buộc người dùng sử dụng các thuộc tính?

Trả lời

6

Phiên bản ngắn là luôn sử dụng các thuộc tính thay vì các trường public (hoặc, thực sự, thậm chí protected) đã là một lựa chọn thiết kế cơ bản trong .NET ngay từ đầu.

Phiên bản dài hơn một chút là việc thêm hỗ trợ cho các trường public sẽ thêm độ phức tạp vào khung ràng buộc dữ liệu (tùy theo cái nào bạn đang đề cập đến). Các lĩnh vực cũng thiếu bất kỳ loại hỗ trợ cho thông báo thay đổi, đó là một khía cạnh khá quan trọng của ràng buộc dữ liệu (ít nhất là trong một môi trường nhà nước như phát triển Winforms). Ngay cả ở cấp độ truy xuất và thiết lập các giá trị, các trường và thuộc tính khác nhau; trong khi cú pháp trong VB.NET hoặc C# để lấy hoặc thiết lập giá trị của một thuộc tính là (theo thiết kế) giống như một trường, thì cơ chế được sử dụng để thực hiện điều này trong một kịch bản có lập trình như ràng buộc dữ liệu là khác nhau đối với các thuộc tính lĩnh vực. Cuối cùng, tất cả điều này chỉ có nghĩa là sẽ mất nhiều công sức để thêm hỗ trợ cho các trường công cộng vào bất kỳ kịch bản ràng buộc dữ liệu nào, vì vậy nó là một mô hình chống dù sao công việc này không được thực hiện.

3

Không có lý do kỹ thuật nào sau hạn chế này: chắc chắn có thể thêm trường công khai vào danh sách thuộc tính và cho phép ràng buộc với chúng. Trên thực tế, có các API trong .NET sẽ chọn một thuộc tính hoặc trường công khai tự động, dựa trên tên riêng. Ví dụ: Phương thức Expression của LINQ có phương thức PropertyOrField sẽ chọn một hoặc phương thức khác, dựa trên loại được biểu thức trả về trong tham số đầu tiên của nó. Tuy nhiên, để các trường công khai cho bạn thấy một loạt các vấn đề tiềm tàng, rằng các nhà thiết kế hệ thống phụ thuộc vào sự phản chiếu thường cố gắng ngăn cản sử dụng các lĩnh vực công cộng bằng cách giữ lại sự hỗ trợ cho họ từ thiết kế hệ thống của họ. Ngoài ra, trong các hệ thống dựa trên các sự kiện ràng buộc, việc sử dụng một trường sẽ không thể vì lý do kỹ thuật, bởi vì người ta không thể kích hoạt sự kiện khi thiết lập một trường công cộng.

+0

I * sẽ * nói rằng có một hạn chế kỹ thuật đối với chúng trong thứ gì đó như Winforms hoặc MVVM ràng buộc dữ liệu, vì cả hai đều dựa vào sự kiện kích hoạt khi giá trị thay đổi để cập nhật giao diện người dùng. Không thể thông báo như vậy với các trường. –

0

Vì bạn không thể khai báo Trường trong Giao diện, bạn không nên sử dụng Trường công khai. Tất cả các trường phải là riêng tư.

Nếu mã của bạn phụ thuộc vào Tóm tắt, bạn cần sử dụng Giao diện và tại đây các Trường công khai không khả dụng.

+0

Mặc dù đây là cả hai điểm tốt, những điều này nói lên lý do tại sao sử dụng các thuộc tính là lựa chọn thiết kế ưu tiên, không phải vì sao hỗ trợ trường không có trong các kịch bản ràng buộc dữ liệu. –

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