Nếu tôi đặt thành viên nhóm là riêng tư và sau đó tôi muốn thành viên đó, chúng tôi phải xác định thuộc tính công khai cho thành viên đó. Nhưng sau đó tôi tự hỏi: Nếu chúng ta có thể sử dụng công khai thành viên lớp học bằng cách tuyên bố một thuộc tính công khai cho nó, thì tại sao chúng ta không chỉ định nghĩa thành viên lớp là công khai?Tại sao lại sử dụng các thuộc tính công khai cho các trường riêng trong C#?
Trả lời
Vì bạn có thể xác thực giá trị được chỉ định trong thuộc tính.
Đây không thực sự là một đối số bởi vì nếu sau này bạn thấy cần phải làm điều này, bạn có thể * vẫn * giới thiệu thuộc tính sau đó. – Timwi
@Timwi, tôi nghĩ rằng việc thay đổi thành viên sang thuộc tính sẽ buộc mã sử dụng loại trong một .dll để biên dịch lại. Mặc dù đây không phải là vấn đề đối với hầu hết mọi người, nếu bạn đang phân phối .dll để sử dụng cho bên thứ 3, điều này cần tránh. – tster
Có, nhưng như bạn đã chỉ ra, nó chỉ áp dụng cho các thư viện. Câu trả lời của bạn không tuyên bố điều đó. – Timwi
Trình truy cập thuộc tính (phương thức nhận, đặt) cho phép bạn thay đổi triển khai của mình là tương lai. Ví dụ, bạn có thể bắt đầu với một trường sao lưu (thành viên lớp riêng) nhưng sau đó thuộc tính có thể trở thành kết quả của một số phép tính. Hơn nữa, cú pháp thuộc tính cho phép bạn có các thành viên chỉ đọc - vì vậy bạn có thể thay đổi giá trị chỉ bên trong lớp của bạn, thế giới bên ngoài chỉ có thể đọc nó.
Đối số này làm cho trường hợp cho thuộc tính chỉ đọc - nhưng không đọc/ghi. Nếu sau này bạn tìm thấy sự cần thiết cho một tài sản vì nó biến thành một giá trị được tính toán, bạn vẫn có thể giới thiệu tài sản sau đó. – Timwi
Microsoft khuyên bạn nên sử dụng các thuộc tính công cộng thay cho các trường công cộng vì lý do khả năng tương thích nhị phân. Đây chỉ là vấn đề nếu bạn đang viết một thư viện (mà các chương trình khác sẽ truy cập).
Về cơ bản, hãy tưởng tượng kịch bản này:
- Bạn tạo một thư viện với một lĩnh vực công
- người khác viết một chương trình sử dụng thư viện của bạn và truy cập mà lĩnh vực công cộng
- Bây giờ bạn muốn thay đổi trường của bạn thành một thuộc tính công khai vì bạn cần xác thực giá trị đầu vào hoặc thuộc tính đã trở thành kết quả của phép tính hoặc bạn muốn nó ném ngoại lệ vì nó quá cũ hoặc bất kỳ điều gì.
- Người dùng cố nâng cấp thư viện của bạn, chứ không phải chương trình sử dụng thư viện.
Điều này sẽ phá vỡ hoàn toàn chương trình - chương trình sẽ ngừng hoạt động và chỉ bị lỗi. Tuy nhiên, nếu thay vì trường bạn đã có quyền sở hữu công khai ngay từ đầu thì bạn có thể trao đổi thư viện.
Điều này tất nhiên chỉ phù hợp với thư viện. Trong tất cả các trường hợp khác, lời khuyên không thực sự có liên quan và bạn có thể sử dụng các trường nếu bạn muốn. Nếu sau đó bạn thấy rằng bạn cần một tài sản, bạn vẫn có thể thay đổi nó thành một thuộc tính sau đó và chương trình của bạn vẫn sẽ biên dịch tốt.
Giải thích rất hay. – Hari
Dưới đây là một số lý do tại sao chúng tôi sử dụng các thuộc tính công khai thay vì các trường công khai.
- Bạn có thể viết mã phức tạp hơn trong phương thức get/set, trong khi chỉ có một giá trị duy nhất trong trường.
- Thuộc tính tạo mã của bạn nhiều hơn "OO". Nói một lớp có tên là Person, chúng tôi có thể dễ dàng đoán rằng có một thuộc tính được gọi là "Tên" trong đó. Nhưng một trường công khai có tên là "Tên" là thực sự là lạ.
- Một số thuộc tính chỉ hoạt động cho các thuộc tính chỉ (AttributeTargets.Property).
Lý do sử dụng các thuộc tính rất đơn giản. Bạn luôn có thể thay đổi xử lý mã nhận/đặt giá trị của nó mà không vi phạm bất kỳ chương trình bên ngoài nào tùy thuộc vào công việc của bạn - điều này là không thể với các trường.Hơn nữa, các thuộc tính có thể được đánh dấu là ảo, và do đó, có thể được định nghĩa lại bởi các lớp con - một lần nữa mà không vi phạm bất kỳ khả năng tương thích nào.
- 1. Tôi có nên sử dụng các thuộc tính công khai và các trường riêng tư hoặc các trường công khai cho dữ liệu không?
- 2. Tại sao các trường công khai nhanh hơn các thuộc tính?
- 3. Tại sao lại chọn Thuộc tính cho các biến công khai?
- 4. Tại sao xác định các thành viên riêng dưới các thành viên công khai trong C++?
- 5. Sử dụng XmlSerializer với các thuộc tính const riêng và công khai
- 6. C#, bất biến và các trường chỉ đọc công khai
- 7. C# Các thuộc tính trên các trường
- 8. Tuyên bố thuộc tính lớp: riêng tư và công khai
- 9. Tại sao thuộc tính được khai báo sử dụng cả giữ lại và chỉ đọc?
- 10. Trường C# được bảo vệ thành riêng tư, thêm thuộc tính - tại sao?
- 11. sử dụng các từ dành riêng làm tên thuộc tính, được xem lại
- 12. Tại sao lại sử dụng "tự" để truy cập các thuộc tính mô hình ActiveRecord/Rails?
- 13. Bất kỳ lý do nào để sử dụng các thuộc tính được tự động triển khai trên các thuộc tính được thực hiện thủ công?
- 14. C# winform: Truy cập các thuộc tính công khai từ các biểu mẫu khác và khác biệt giữa thuộc tính tĩnh và công khai
- 15. Tại sao có thuộc tính trống được đặt thay vì sử dụng biến thành viên công khai?
- 16. Tại sao chúng ta sử dụng các thuộc tính .NET thay cho các hàm get/set cũ?
- 17. Tại sao tôi nên sử dụng biến riêng tư trong trình truy cập thuộc tính?
- 18. Sử dụng các biến trong thuộc tính trong C#
- 19. Refactor C# thuộc tính tự động cho các trường và thuộc tính getter/setter?
- 20. Thuộc tính không được chỉ định sử dụng các trường bit trong lớp C++
- 21. Tại sao cần gọi: this() trên cấu trúc để sử dụng các thuộc tính tự động trong C#?
- 22. Có thuộc tính công khai trong lớp C++
- 23. Có trường hợp sử dụng hợp lệ nào để sử dụng các biến công khai trong PHP OOP không?
- 24. Tại sao các thuộc tính luôn được cho là tạo ra nonatomic trong Objective C?
- 25. Tại sao lại sử dụng các tác dụng phụ xấu trong các nhà xây dựng JavaScript?
- 26. Tôi cần xác định __setattr__ để gán các trường không có thuộc tính, nhưng sử dụng hàm setter/getter cho các trường có thuộc tính được xác định
- 27. force get/set truy cập các biến riêng tư cho các thuộc tính riêng
- 28. Sử dụng các thuộc tính để gọi các phương thức
- 29. Sử dụng các thuộc tính C# trong mã C++ không được quản lý
- 30. Tại sao lại sử dụng JNDI cho các nguồn dữ liệu
bạn đang hỏi gì? Điều đó (một câu) là không thể giải mã được. – tster
Tôi đã chỉnh sửa nó rất nhiều. Tôi nghĩ đây là ý của anh ấy. – Timwi
Tôi nghĩ câu cuối cùng "... là tư nhân ở nơi đầu tiên" nên được thay đổi thành "... là công khai lúc đầu". –