Optimización de Listas: Buenas Prácticas en C#
Clase 14 de 35 • Curso de C# con .Net Core 2.1
Contenido del curso
Etapa 5 – POO reutilicemos nuestro código
- 2

Herencia para reutilizar código C#
10:30 min - 3

Herencia y Polimorfismo en Programación Orientada a Objetos
11:42 min - 4

Polimorfismo en Programación Orientada a Objetos
13:17 min - 5

Casting en C#: cuándo funciona y cuándo falla
07:09 min - 6

Conversiones seguras en C# con is y as
12:44 min - 7

Sobrescribir ToString para depuración en C#
08:15 min
Etapa 6- Ajustes y funcionalidad
Etapa 7 – Preparando información para nuestros reportes
- 11

Manejo Avanzado de Métodos y Parámetros en Programación
15:43 min - 12

Manejo de Parámetros de Salida en Visual Studio Code
04:38 min - 13

Sobrecarga de Métodos para Parámetros de Salida Opcionales
05:51 min - 14

Optimización de Listas: Buenas Prácticas en C#
Viendo ahora - 15

Dictionary: cómo funciona en C#
11:14 min - 16

Diccionarios con polimorfismo en C#
10:48 min - 17

Uso de Constantes y Enumeraciones para Optimizar Diccionarios en C#
11:33 min - 18

Foreach anidado para diccionarios en C#
13:47 min - 19

Depuración de diccionarios en C#
09:37 min - 20

Parámetro opcional para controlar impresión en C#
11:47 min - 21

Cómo usar switch en lugar de if/else
14:30 min - 22

Números aleatorios y eventos en C#
12:52 min - 23

Diccionarios y Refactoring en Programación Básica
02:13 min
Etapa 8 – Consultas
- 24

Cómo crear un reporteador en C sharp
11:42 min - 25

Generación segura de reportes en sistemas de información
10:21 min - 26

Construcción de reportes con LINQ en C#
11:48 min - 27

Diccionario con evaluaciones por asignatura
08:32 min - 28

Tipos anónimos en LINQ para reportes complejos
10:52 min - 29

Cálculo del Promedio de Notas Agrupadas por Alumno y Asignatura
10:46 min - 30

Creación de Tipos de Datos Personalizados en Programación Avanzada
12:05 min - 31

Generación de Reportes con LINQ en C#
02:09 min
Etapa 9 – Creando una UI de Consola
Exponer colecciones mutables puede romper la integridad de tu dominio. Aquí aprenderás a proteger tus datos con listas de solo lectura, a preferir interfaces genéricas como IEnumerable, y a evitar que otros desarrolladores inserten objetos fuera de la estructura correcta. La meta: APIs seguras, claras y fáciles de usar.
¿Por qué evitar listas modificables públicas?
Cuando devuelves una lista concreta, cualquier consumidor puede modificarla. El ejemplo es claro: alguien podría hacer listaObjetos.agregar y crear un "curso loco" que no pertenece a la escuela ni a ningún curso o alumno. Ese objeto sería huérfano y rompería la relación entre cursos, asignaturas y evaluaciones.
- Evita que agreguen cursos fuera de la escuela.
- Impide evaluaciones sin curso ni alumno asociado.
- Protege la integridad de tus estructuras.
Código ilustrativo del problema:
// Riesgo: lista pública y modificable
listaObjetos.Add(new Curso { Nombre = "curso loco" }); // Se agrega fuera de la escuela.
La práctica recomendada es no exponer una lista modificable cuando el objetivo no es permitir cambios.
¿Cómo implementar listas de solo lectura en C#?
La solución: devolver una lista de solo lectura. Se menciona usar ReadOnlyList y IReadOnlyList, y convertir con "as read only" al momento de retornar. Así, el consumidor no podrá adicionar elementos.
- Devuelve ReadOnlyList en los métodos públicos.
- Usa IReadOnlyList como tipo de recepción cuando consumas.
- Aplica la conversión "as read only" al retornar la colección.
Ejemplo de implementación y consumo:
// En tu *engine*: exponer en solo lectura
ReadOnlyList<Curso> ObtenerCursos()
{
// ... construir lista interna
return listaCursos.AsReadOnly(); // "as read only" al devolver.
}
// Consumo con var: el tipo se infiere como IReadOnlyList
var cursos = ObtenerCursos();
// Intento de modificación: producirá advertencia/error en tiempo de compilación
cursos.Add(new Curso { Nombre = "curso loco" }); // No permitido: colección de solo lectura.
Punto clave: si declaras con var, no necesitas cambiar el tipo explícito cuando el método pase a devolver una lista de solo lectura. El compilador inferirá el tipo correcto.
¿Qué error previenes al usar read only?
- Evitas inserciones imprevistas en colecciones compartidas.
- Bloqueas cambios que no pasan por las reglas del dominio.
- Garantizas que la colección expuesta es inmutable para el consumidor.
¿Qué interfaces genéricas conviene devolver?
Regla de oro: no devuelvas un tipo de lista específico. Prefiere interfaces genéricas. En particular, IEnumerable permite que cada consumidor convierta la secuencia al tipo de colección que necesite, sin atarse a una implementación concreta.
- Devuelve IEnumerable cuando solo necesitas iteración.
- Devuelve IReadOnlyList si quieres iteración con acceso indexado sin modificaciones.
- Reserva la lista concreta para uso interno.
Ejemplo de firma genérica:
IEnumerable<Curso> ObtenerCursos(); // Flexible para el consumidor.
Conceptos y habilidades clave integrados:
- IEnumerable: interfaz para enumerar colecciones sin exponer implementación.
- IReadOnlyList: colección indexable que no permite modificaciones externas.
- ReadOnlyList: colección expuesta en modo de solo lectura.
- as read only: conversión al retornar para bloquear Add/Remove.
- var: inferencia de tipos que simplifica el consumo tras cambiar el tipo de retorno.
- Buenas prácticas de API: encapsular colecciones y evitar efectos secundarios.
¿Tienes un caso real en el que necesites exponer colecciones sin perder control? Cuéntalo en los comentarios y revisamos juntos la mejor estrategia.