Comenzamos la etapa tres del proyecto con un enfoque práctico: implementar funcionalidades con colecciones para manejar cursos de forma flexible. Aquí verás por qué, en la mayoría de casos, las colecciones superan a los arreglos, cuándo elegir cada una y qué tipos de colecciones ofrece C# para escribir código más claro, seguro y eficiente.
¿Qué diferencia a arreglos y colecciones en rendimiento?
Los arreglos son lineales en memoria y extremadamente eficientes al recorrer grandes cantidades de datos. Consumen menos memoria porque colocan un objeto junto a otro, sin tanta metadata adicional. Con tipos nativos como entero, flotante y booleano, el rendimiento es máximo.
- Arreglos: más rápidos en memoria. Acceso lineal y constante al recorrer datos grandes.
- Menor consumo de memoria. Organización contigua sin overhead extra.
- Con tipos nativos: rendimiento al máximo. ejemplo: un entero, un flotante, un booleano.
- Ideales en bajo nivel. Desarrollo de productos y librerías como una API web o una DLL optimizada.
En contraste, las colecciones priorizan la flexibilidad: permiten agregar y remover elementos, ajustar tamaño y especializar comportamientos sin reescribir estructuras desde cero.
- Colecciones: manipulación sencilla. agregar y remover miembros sin recrear estructuras.
- Tamaño flexible. ampliar o recortar según necesidad.
- Extensibles y personalizables. añadir funcionalidades o crear nuevos tipos.
¿Cuándo conviene usar arreglos o colecciones?
La guía práctica es clara: en la mayoría de casos, usa colecciones. El esfuerzo adicional para exprimir rendimiento con arreglos no suele compensar frente a la facilidad de desarrollo y mantenimiento que brindan las colecciones.
- Usa arreglos cuando: el procesamiento es intensivo y crítico para CPU. ejemplos: cálculos matemáticos, entrada/salida, envío de tramas por red.
- Usa colecciones cuando: necesitas agregar o remover elementos, cambiar tamaños o aprovechar implementaciones listas para tareas específicas.
- También son válidos arreglos en casos simples: cuando crear uno no implica complejidad extra.
Recuerda una limitación clave: un arreglo no puede crecer ni reducirse. No se pueden remover miembros, solo cambiar el valor en cada posición. En colecciones sí puedes agregar y quitar elementos libremente.
¿Qué tipos de colecciones existen en C# y cómo elegir?
En C# podemos agrupar colecciones como simples, especializadas, genéricas y concurrentes. La elección impacta directamente el rendimiento y la ergonomía al programar.
¿Qué son las colecciones simples y el boxing/unboxing?
Las simples almacenan todo como objeto. Para guardar un valor o instancia, ocurre boxing: se mete en una “caja” de tipo objeto. Al recuperarlo, necesitas unboxing para volver al tipo original. Esto tiene costo de memoria y procesamiento, un claro performance penalty.
- Efecto práctico: más sobrecarga en memoria y CPU.
- Uso actual: hoy (2018) casi no se usan, salvo que todo se maneje como objeto por una razón concreta.
¿Por qué las colecciones genéricas dominan el 90 %?
Las genéricas evitan boxing/unboxing. Se definen sin cuerpo de tipo y, al crear la colección, indicas qué clase u objeto manejará. Así, trabajan con el tipo real desde compilación.
- Ventaja clave: sin penalización en memoria ni procesamiento.
- Experiencia de desarrollo: tipado fuerte y más seguridad al programar.
- Comparación con Java: en Java los generics son sintácticos; por detrás se comportan como colecciones no genéricas y mantienen los costos de las simples. En C#, el compilador genera código específico para el tipo indicado.
Sobre las especializadas: existen para tipos concretos, por ejemplo, StringCollection, BitVector, ListDictionary, NameValueCollection. Agregan operaciones útiles en contextos puntuales, aunque no son las más usadas.
¿Qué resuelven las colecciones concurrentes?
C# está pensado para el multiparalelismo y múltiples cores. Si varios cores acceden a la misma colección, pueden surgir inconsistencias: un hilo referencia un objeto que otro eliminó. Las colecciones concurrentes integran control de acceso para evitar estos errores.
- Objetivo: garantizar operaciones seguras en escenarios con acceso simultáneo.
- Resultado: datos coherentes sin que un hilo “pise” el trabajo del otro.
¿Con qué colecciones trabajas hoy y por qué las elegiste? Comparte tus dudas y experiencias en los comentarios para enriquecer la discusión.