2009-04-13 32 views
12

nàyTại sao là HashSet <T> .IsReadOnly rõ ràng?

var h = new HashSet<int>(); 
var r = h.IsReadOnly; 

không biên dịch. Tôi phải làm

var r = ((ICollection<int>)h).IsReadOnly; 

tại sao IsReadOnly được triển khai bình thường?

(Tôi không yêu cầu cách, nhưng tại sao )

Trả lời

16

Tôi đoán nó bởi vì, trong khi HashSet thực hiện ICollection, IsReadOnly không có ý nghĩa cho HashSet. Trong thực tế, nếu bạn phản ánh nó, tài sản luôn luôn trả về false. Thực hiện nó ẩn một cách rõ ràng phương thức này từ giao diện công cộng.

Lý do khác là do giao diện ICollection có thể được triển khai vì lý do ngẫu nhiên (ví dụ: để hỗ trợ xaml serialization) thay vì vì nó cần thiết cho việc sử dụng chính của lớp. Vì vậy, thực hiện nó một cách rõ ràng có thể giữ lộn xộn ra khỏi giao diện của lớp.

+0

Ah, vâng, điều đó có ý nghĩa. HashSet cũng ẩn IsReadOnly vì cùng một lý do tôi đoán, do đó lỗi biên dịch nếu bạn cố gắng sử dụng nó. –

+0

BTW, bạn không cần triển khai ICollection cho xaml serialization; bộ sưu tập phải triển khai IDictionary hoặc IList. Nó chỉ là một ví dụ về những dịp khi bạn có thể cần phải cấy ghép một giao diện vì lý do ngẫu nhiên. – Will

5

Về cơ bản có hai lý do tại sao bạn lại dùng đến một thực hiện giao diện rõ ràng (nguồn: MSDN):

  1. Bạn thực hiện nhiều giao diện với các thành viên có chứa các chữ ký giống nhau, và bạn muốn các thành viên cư xử khác nhau.
  2. Thành viên giao diện không được quan tâm đặc biệt đối với lớp học, nhưng là bắt buộc để tham chiếu các đối tượng theo giao diện.

Đối với HashSet<T>, trường hợp sau áp dụng, vì bộ băm không bao giờ chỉ đọc và IsReadOnly do đó sẽ luôn trả về false.

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