Đó là hình thức tốt để làm như vậy khi thành viên là vô nghĩa trong bối cảnh. Ví dụ: nếu bạn tạo một bộ sưu tập chỉ đọc thực hiện IList<T>
bằng cách ủy quyền cho một đối tượng nội bộ _wrapped
thì bạn có thể có một cái gì đó như:
public T this[int index]
{
get
{
return _wrapped[index];
}
}
T IList<T>.this[int index]
{
get
{
return this[index];
}
set
{
throw new NotSupportedException("Collection is read-only.");
}
}
public int Count
{
get { return _wrapped.Count; }
}
bool ICollection<T>.IsReadOnly
{
get
{
return true;
}
}
Ở đây chúng tôi có bốn trường hợp khác nhau.
public T this[int index]
được định nghĩa bởi lớp của chúng tôi chứ không phải giao diện, và do đó tất nhiên không phải là một triển khai rõ ràng, mặc dù lưu ý rằng nó xảy ra tương tự như đọc-ghi T this[int index]
được xác định trong giao diện nhưng chỉ đọc.
T IList<T>.this[int index]
là rõ ràng bởi vì một phần của nó (getter) được kết hợp hoàn hảo bởi thuộc tính ở trên và phần khác sẽ luôn ném ngoại lệ. Mặc dù quan trọng đối với ai đó truy cập một thể hiện của lớp này thông qua giao diện, nhưng việc ai đó sử dụng nó thông qua một biến của loại lớp là vô nghĩa.
Tương tự vì bool ICollection<T>.IsReadOnly
luôn luôn trả về đúng, nó hoàn toàn vô nghĩa đối với mã được viết theo kiểu của lớp, nhưng có thể rất quan trọng đối với việc sử dụng nó thông qua loại giao diện, và do đó chúng tôi triển khai nó một cách rõ ràng.
Ngược lại, public int Count
không được triển khai rõ ràng bởi vì nó có khả năng có thể được sử dụng cho ai đó sử dụng một thể hiện thông qua loại của chính nó.
Nhưng với trường hợp "rất hiếm khi được sử dụng" của bạn, tôi thực sự sẽ nghiêng về việc không sử dụng một triển khai rõ ràng.
Trong các trường hợp tôi khuyên bạn nên sử dụng một triển khai rõ ràng, gọi phương thức thông qua một biến kiểu của lớp sẽ là một lỗi (cố gắng sử dụng trình thiết lập được lập chỉ mục) hoặc vô nghĩa (kiểm tra một giá trị sẽ luôn giống nhau) để ẩn họ đang bảo vệ người dùng khỏi mã lỗi hoặc tối ưu phụ. Điều đó khác biệt đáng kể với mã mà bạn nghĩ là hiếm khi được sử dụng. Vì vậy, tôi có thể cân nhắc sử dụng EditorBrowsable
thuộc tính để che giấu thành viên khỏi intellisense, mặc dù tôi sẽ cảm thấy mệt mỏi; bộ não của mọi người đã có phần mềm riêng để lọc ra những gì họ không quan tâm.