Điều này đã được nói, nhưng tôi không thấy bất kỳ câu trả lời nào là siêu rõ ràng.
Cách đơn giản nhất là chỉ cần trả về một ReadOnlyCollection
private List<object> objs;
public ReadOnlyCollection<object> Objs {
get {
return objs.AsReadOnly();
}
}
Hạn chế với điều này là, nếu bạn muốn thay đổi thực hiện của bạn sau này, sau đó một số người gọi có thể đã được phụ thuộc vào thực tế, rằng bộ sưu tập cung cấp quyền truy cập ngẫu nhiên. Vì vậy, một định nghĩa an toàn hơn là chỉ phơi bày một IEnumerable
public IEnumerable<object> Objs {
get {
return objs.AsReadOnly();
}
}
Lưu ý rằng bạn không phải gọi AsReadOnly() để biên dịch mã này. Nhưng nếu bạn không làm như vậy, người gọi tôi chỉ cần truyền giá trị trả về trở lại một Danh sách và sửa đổi danh sách của bạn.
// Bad caller code
var objs = YourClass.Objs;
var list = objs as List<object>;
list.Add(new object); // They have just modified your list.
Điều này cũng vấn đề tiềm ẩn cũng tồn tại với giải pháp
public IEnumerable<object> Objs {
get {
return objs.AsEnumerable();
}
}
này Vì vậy, tôi chắc chắn sẽ khuyên bạn nên gọi AsReadOnly() trên cho bạn danh sách, và trả lại giá trị đó.
Lưu ý rằng chúng tôi sẽ không bao giờ tối ưu hóa cuộc gọi * rõ ràng * để Chọn nếu điều đó xuất hiện trong mã của bạn. Chúng tôi sẽ tối ưu hóa cuộc gọi ngầm để Chọn khi chuyển biểu thức truy vấn thành các cuộc gọi phương thức. Nếu bạn nói "từ x trong y trong đó b chọn x" thì không có Chọn cuộc gọi, chỉ cần ở đâu. Nhưng nếu bạn nói "từ x trong y chọn x" thì chúng ta không chỉ tạo "y", chúng ta tạo ra một cuộc gọi chọn trên nó để đảm bảo tính bất biến của kết quả. Câu trả lời –