vectores una tipos resueltos programacion matriz llenar ingresar imprimir funciones ejercicios ejemplos datos con como caracteres arreglos c# arrays list mutable enumerator

tipos - ¿Por qué las matrices C#usan un tipo de referencia para la enumeración, pero la Lista<T> usa una estructura mutable?



tipos de arreglos en c++ (2)

Por lo que he leído, se tomó una decisión de diseño para que ciertos tipos de enumeradores de colecciones sean estructuras mutables en lugar de tipos de referencia por razones de rendimiento.

Buena pregunta.

En primer lugar, tienes razón. Aunque en general, los tipos de valores mutables son un mal olor de código, en este caso están justificados:

  • La mutación está casi completamente oculta al usuario.
  • Es muy poco probable que alguien use el enumerador de manera confusa.
  • El uso de un tipo de valor mutable realmente resuelve un problema de rendimiento realista en un escenario extremadamente común.

Me pregunto si alguien sabe por qué se implementó el iterador genérico de Array como un tipo de referencia cuando muchas otras colecciones críticas de rendimiento utilizaron estructuras mutables en su lugar.

Porque si usted es el tipo de persona que está preocupada por el rendimiento de la enumeración de una matriz, ¿por qué utiliza un enumerador en primer lugar? Es un conjunto por el amor de Dios; simplemente escriba un bucle for que recorra sus indicaciones como una persona normal y nunca asigne el enumerador. (O un bucle foreach ; el compilador de C # reescribirá el bucle foreach en el equivalente for loop si sabe que la colección de bucles es una matriz).

La única razón por la que obtendría un enumerador de una matriz en primer lugar es que si lo pasa a un método que toma un IEnumerator<T> , en cuyo caso, si el enumerador es una estructura, entonces será boxeo de todos modos ¿Por qué asumir el costo de hacer el tipo de valor y luego encajarlo? Solo haz que sea un tipo de referencia para empezar.

Por lo que he leído, se tomó una decisión de diseño para que ciertos tipos de enumeradores de colecciones sean estructuras mutables en lugar de tipos de referencia por razones de rendimiento. List.Enumerator es el más conocido.

Estaba investigando un código antiguo que usaba matrices, y me sorprendió descubrir que las Matrices C # devuelven el tipo SZGenericArrayEnumerator como su tipo de enumerador genérico, que es un tipo de referencia.

Me pregunto si alguien sabe por qué se implementó el iterador genérico de Array como un tipo de referencia cuando muchas otras colecciones críticas de rendimiento utilizaron estructuras mutables en su lugar.


Las matrices reciben un tratamiento especial en el compilador de C #. Cuando usas foreach en ellos, el compilador lo traduce en un bucle for . Por lo tanto, no hay beneficios de rendimiento en el uso de enumeradores struct .

List<T> por otro lado, es una clase simple sin ningún tratamiento especial, por lo que usar una estructura da como resultado un mejor rendimiento.