Tôi có câu hỏi "thực tiễn tốt nhất" về OOP trong C # (nhưng nó áp dụng cho tất cả các ngôn ngữ).
Xem xét việc có lớp thư viện với đối tượng được tiếp xúc với công chúng, thông qua người truy cập thuộc tính, nhưng chúng tôi không muốn công chúng (những người sử dụng lớp thư viện này) thay đổi nó.
class A
{
// Note: List is just example, I am interested in objects in general.
private List<string> _items = new List<string>() { "hello" }
public List<string> Items
{
get
{
// Option A (not read-only), can be modified from outside:
return _items;
// Option B (sort-of read-only):
return new List<string>( _items );
// Option C, must change return type to ReadOnlyCollection<string>
return new ReadOnlyCollection<string>( _items );
}
}
}
Rõ ràng cách tiếp cận tốt nhất là "tùy chọn C", nhưng rất ít đối tượng có biến thể ReadOnly (và chắc chắn không có lớp nào do người dùng định nghĩa có nó).
Nếu bạn là người dùng của lớp A, bạn có muốn thay đổi
List<string> someList = ( new A() ).Items;
tuyên truyền cho đối tượng gốc (A)? Hoặc có thể trả lại một bản sao miễn là nó được viết như vậy trong các bình luận / tài liệu không? Tôi nghĩ rằng phương pháp nhân bản này có thể dẫn đến các lỗi khá khó theo dõi.
Tôi nhớ rằng trong C ++, chúng ta có thể trả về các đối tượng const và bạn chỉ có thể gọi các phương thức được đánh dấu là const trên nó. Tôi đoán không có tính năng / mẫu như vậy trong C #? Nếu không tại sao họ không bao gồm nó? Tôi tin rằng nó được gọi là const đúng.
Nhưng một lần nữa, câu hỏi chính của tôi là về "những gì bạn mong đợi" hoặc cách xử lý Tùy chọn A vs B.