2010-02-16 7 views
11

En un documento de estándares de codificación, me encontré con esta declaración:¿Por qué debería evitar iterar sobre colecciones de valor-tipo inmutables utilizando foreach?

Evitar el uso de foreach para iterar sobre colecciones de tipo de valor inmutable. P. ej. Matrices de cadenas

¿Por qué se debe evitar esto?

+2

Si el documento de estándares de codificación no admite sus directrices con citas y razonamientos, es incluso más inútil que la mayoría de los documentos de estándares de codificación. Y eso es decir algo. –

+4

Me resulta especialmente interesante que una matriz de cadenas se utilice como ejemplo de una colección inmutable * value-type *. –

+0

Ambos string y array son tipos de referencia ... –

Respuesta

18

No debe evitarlo. El documento estándar de codificación que estás leyendo es una tontería. Trate de encontrar al autor y pídale que lo explique.

Aparte de todo lo demás, string es un tipo de referencia y las matrices son siempre mutables ... esto me preocupa la calidad del resto del documento, para ser honesto. ¿Hay alguna otra recomendación sospechosa?

(Es posible que "inmutable" se entiende que se refiere al tipo de valor en lugar de la colección -. El hecho de que es ambigua es otra señal preocupante, OMI)

+3

¡Y no solo eso sino que el único tipo de buen valor es un tipo de valor inmutable! –

+6

Un documento de estándares de codificación que habla tonterías? * Detener las imprentas * –

+0

Este es el documento en cuestión: http://weblogs.asp.net/lhunt/pages/CSharp-Coding-Standards-document.aspx (página 16, Sección 4.3, # 35). Tampoco podría darle sentido. Trataré de ver si el autor comentará sobre esto. – driis

6

Estoy de acuerdo con Jon que el consejo hace poco sentido. Mi suposición es que el autor descubrió que no puede cambiar el valor del elemento actual cuando itera. Sin embargo, si está iterando una colección de tipos de referencia, puede modificar el objeto al que apunta el elemento actual. Tal vez (s) llegó a la conclusión de que la iteración se rompió de alguna manera para colecciones de tipo de valor.

8

Creo que la razón de esa afirmación es que está escrita antes de .NET 2.0.

Al utilizar foreach en .NET 1.x, se estaba utilizando la interfaz IEnumerable (ya que la interfaz IEnumerable<T> aún no existía). Al iterar sobre una colección de tipos de valores, el enumerador colocaría cada elemento para poder devolver como referencia de objeto, luego el código foreach tuvo que destrabarlo.

Una matriz de cadenas no es, por supuesto, un ejemplo de una matriz de tipos de valores. Una matriz de enteros es.

+0

Incluso una matriz de enteros no tendría sentido, ya que el compilador de C# trata las matrices de forma diferente cuando se utiliza foreach . –

+0

@Jon: Sí, un foreach sobre una matriz está altamente optimizado en la implementación actual, pero podría no haber estado en las primeras versiones. – Guffa

+0

Creo que siempre ha sido optimizado; de hecho, tiene más sentido que haya sido optimizado * antes * genéricos que * después *, para evitar el boxeo. –

Cuestiones relacionadas