IEnumerable y IEnumerator en la misma clase, mala idea?
-
22-09-2019 - |
Pregunta
¿Es esta una mala idea?
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
Esta clase sólo es visible como un IEnumerable (Of T) Propiedad de sólo lectura, y me ahorra una clase adicional que envuelve IEnumerator (Of T). Pero de alguna manera que sólo parece mal. ¿Hay una mejor manera?
Solución
Esta es una mala idea porque la solución se romperá si alguien intenta enumerar su colección más de una vez al mismo tiempo.
Por ejemplo: Esto romperá de alguna manera
For Each cur1 in yourObj
For Each cur2 in yourObj
Console.WriteLine("{0} - {1}", cur1,cur2)
Next
Next
Otros consejos
Sin duda una mala idea. En particular, esto significa que dos llamadas a GetEnumerator
volverán referencias al mismo objeto. - cuando deberían volver independiente iteradores
Ahora, habiendo dicho esto, el compilador de C # generará clases que implementan ambos tipos si se utiliza bloques de iterador ... pero hace todo lo posible para asegurarse de que lo hace bien. Yo sugiero que no se pone a través de ese dolor:)
proporcionan un método GetEnumerator () que devuelve un struct pública anidada llamado “enumerador”.
Por cierto, este sitio web es mantenido por Brad Abrams - uno de los autores de Marco de Diseño Directrices .