2010-03-25 23 views
5

Đây có phải là một ý tưởng tồi không?IEnumerable và IEnumerator trong cùng một lớp học, ý tưởng tồi?

Private Class GH_DataStructureEnumerator(Of Q As Types.IGH_Goo) 
    Implements IEnumerable(Of Q) 
    Implements IEnumerator(Of Q) 
    .... 
    .... 
    'Current, MoveNext, Reset etc.' 
    .... 
    .... 

    Public Function GetEnumerator_Generic() As IEnumerator(Of Q) _ 
        Implements IEnumerable(Of Q).GetEnumerator 
    Return Me 
    End Function 
End Class 

Lớp này chỉ hiển thị dưới dạng thuộc tính chỉ đọc của IEnumerable (Of T) và tiết kiệm cho tôi lớp bổ sung kết thúc tốt IEnumerator (Of T). Nhưng bằng cách nào đó nó chỉ có vẻ sai. Có cách nào tốt hơn?

Trả lời

4

Đây là một ý tưởng tồi bởi vì giải pháp sẽ bị hỏng nếu ai đó cố gắng liệt kê bộ sưu tập của bạn nhiều hơn một lần cùng một lúc.

Ví dụ: Điều này sẽ phá vỡ trong một số cách

For Each cur1 in yourObj 
    For Each cur2 in yourObj 
    Console.WriteLine("{0} - {1}", cur1,cur2) 
    Next 
Next 
+2

Hoặc thậm chí không cùng một lúc, khá có thể :) –

+0

@Jon rất đúng! – JaredPar

5

Chắc chắn là một ý tưởng tồi. Đặc biệt, điều đó có nghĩa là hai lệnh gọi tới GetEnumerator sẽ trả về các tham chiếu đến cùng một đối tượng - khi chúng phải trả lại trình lặp độc lập độc lập.

Bây giờ đã nói rằng, trình biên dịch C# sẽ tạo ra các lớp thực hiện cả hai loại nếu bạn sử dụng khối lặp ... nhưng nó đi đến độ dài lớn để đảm bảo rằng nó được nó đúng. Tôi đề nghị bạn đừng tự đặt mình qua nỗi đau đó :)

+0

Jon, mục tiêu của cuộc đời tôi là tránh đau đớn, cảm ơn những người đứng đầu. –

1

Từ Implementing IEnumerable:

Do cung cấp một phương pháp GetEnumerator() trả về một cấu trúc công cộng lồng nhau gọi là “Enumerator” .

Nhân tiện, trang web này được duy trì bởi Brad Abrams - một trong những tác giả của Framework Design Guidelines.

+0

Tôi chưa bao giờ thích đề xuất cụ thể này - nó khuyến khích các cấu trúc có thể thay đổi, có thể hoạt động theo những cách xấu xa. –

+1

@Jon - Đó là một điểm tốt nhưng tôi nghĩ rằng trong trường hợp này nó không phải là ý tưởng tồi tệ nhất. Đó chắc chắn là một sự cân bằng giữa hiệu suất (ít áp lực bộ nhớ với cấu trúc) và có cấu trúc có thể thay đổi được, có thể giới thiệu tính khủng khiếp trong ứng dụng. Tôi nghĩ rằng với thực tế là hầu hết các nhà phát triển không làm việc với cá thể liệt kê trực tiếp rằng có nó là một cấu trúc có thể thay đổi được một sự cân bằng tốt cho lợi ích hiệu suất. Nhưng nói chung tôi đồng ý rằng các cấu trúc có thể thay đổi nên tránh. –

+0

Brad làm cho thương mại-off rất rõ ràng: Thực hiện mô hình này liên quan đến việc có thêm một loại công cộng (Enumerator) và một số phương pháp công cộng thêm mà thực sự có chỉ vì lý do cơ sở hạ tầng. Những loại này thêm vào sự phức tạp nhận thức của API và phải được ghi lại, thử nghiệm, phiên bản, v.v. ** Do đó, mẫu này chỉ nên được theo dõi khi hiệu suất là tối quan trọng. ** Do đó, điều này sẽ * không * được sử dụng hầu hết thời gian mà hiệu suất không quá quan trọng. –

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