Sự khác nhau giữa IEnumerator và IEnumerable là gì?
Câu trả lời của Jason rất hay nhưng tôi nghĩ tôi chỉ cần thêm suy nghĩ về điều này. Hãy tưởng tượng bạn có một chuỗi:
1, 1, 2, 3, 5, 8, 13, ...
Bây giờ hãy tưởng tượng bạn có một mũi tên trỏ tại một số vị trí của chuỗi rằng:
1, 1, 2, 3, 5, 8, 13, ...
^
Một "mũi tên" là một đối tượng có thể làm hai việc. Đầu tiên, nó có thể cung cấp cho bạn thứ mà nó đang trỏ đến. Thứ hai, nó có thể làm cho chính nó chỉ vào điều tiếp theo.
Trình đếm số là một mũi tên. Nó có một thuộc tính, Current, cung cấp cho bạn thứ mà nó trỏ đến. Nó có một phương thức, MoveNext() làm cho chính nó trỏ đến điều tiếp theo.
Làm thế nào để bạn nhận được mũi tên ngay từ đầu? Bạn cần một nhà máy mũi tên. Bạn yêu cầu nhà máy cho một mũi tên, và nó cung cấp cho bạn một mũi tên trỏ đến phần tử đầu tiên trong chuỗi.
IEnumerable là một nhà máy mũi tên. Nó có một phương thức, GetEnumerator, cung cấp cho bạn một mũi tên đến phần tử đầu tiên của chuỗi.
Thuộc tính tốt đẹp của lược đồ này là bạn có thể có nhiều mũi tên trỏ đến các địa điểm khác nhau trong cùng một trình tự.
lợi ích của việc triển khai giao diện chung là gì IEnumerable thay vì chỉ IEnumerable?
Giả sử trình tự là số nguyên. Nếu bạn thực hiện IEnumerable
sau đó khi bạn nói
foreach(int x in mysequence)
điều đó sẽ thực sự làm là chuyển đổi int trong chuỗi phản đối, boxing số nguyên, và sau đó ngay lập tức Unbox đối tượng trở về nguyên, thêm một cấp phát bộ nhớ hoàn toàn không cần thiết cho mọi hoạt động đơn lẻ. Nếu trình biên dịch biết rằng trình tự là số nguyên thì nó có thể bỏ qua thao tác boxing không cần thiết.
Giả sử chuỗi là chuỗi. Nếu bạn thực hiện IEnumerable<string>
sau đó bạn có thể nói:
string first = mysequence.First();
Nếu không, sau đó bạn có thể nói
string first = (string)mysequence.First();
đó là không cần thiết và dễ bị lỗi. Thay vì hướng dẫn trình biên dịch thông qua một dàn diễn viên rằng loại là chuỗi, bạn có thể chỉ cần bảo đảm rằng loại đó là chuỗi bằng cách sử dụng hệ thống kiểu.
Tôi sẽ để john skeet trả lời câu hỏi này –
@ Hasan: Tôi sợ những gì anh ấy sẽ làm với bạn bằng cách viết sai chính tả tên của anh ấy. – JYelton