Khi tôi triển khai giao diện IEnumerable<T>
Tôi thấy hai phương thức GetEnumerator
: một trả lại IEnumerator
và IEnumerator<T>
khác. Khi nào tôi sẽ sử dụng cái này hay cái khác?IEnumerable <T> cung cấp hai phương thức GetEnumerator - sự khác nhau giữa chúng là gì?
Trả lời
Nếu bạn đang thực hiện giao diện chung IEnumerable<T>
, bạn sẽ khá nhiều luôn phải sử dụng phương thức GetEnumerator generic - trừ khi bạn cast đối tượng của bạn một cách rõ ràng để (không chung chung) IEnumerable.
Lý do là tính tương thích ngược với .NET 1.0/1.1 không hỗ trợ Generics.
Cái này là chung, cái kia thì không. Tôi tin rằng trình biên dịch thích sử dụng quá tải chung.
Thường là GetEnumerator()
gọi GetEnumerator<T>()
, vì vậy sẽ không có nhiều khác biệt về hành vi. Đối với lý do tại sao có hai phương pháp, điều này được thực hiện cho khả năng tương thích ngược và để sử dụng trong trường hợp T
không phải là mối quan tâm lớn (hoặc chỉ là không xác định).
Lý do có hai phương pháp là vì IEnumerable<T>
kế thừa giao diện IEnumerable
để bạn thấy phương pháp chung từ IEnumerable<T>
và phương pháp không chung chung từ IEnumerable
.
Đây là cách bạn muốn thực hiện các giao diện trong loại của bạn:
class Foo : IEnumerable<Foo>
{
public IEnumerator<Foo> GetEnumerator()
{
// do your thing here
}
// do a EIMI here and simply call the generic method
IEnumerator IEnumerable.GetEnumerator()
{
this.GetEnumerator();
}
}
Bạn thường thực hiện cả hai. Một là phiên bản mới, tổng quát trả về một điều tra viên an toàn (IEnumerator<T>
). Cách khác là khả năng tương thích với mã Legacy (trả về IEnumerator
). Một thực hiện điển hình là:
public IEnumerator<T> GetEnumerator() {
foreach(T item in items) {
yield return item;
}
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
điều này đã giúp tôi rất nhiều, tránh các lớp học bổ sung cho các điều tra lồng nhau! –
+1. Tôi cũng đã googling để tìm một thực hiện tham khảo mà tránh lớp liệt kê lồng nhau và đây là câu trả lời đầu tiên tôi đến. –
+1 - EIMI = Triển khai thành viên giao diện rõ ràng –
Nhưng làm thế nào trên trái đất 'Foo: IEnumerable 'có ý nghĩa? –
nawfal