Manejo Avanzado de Métodos y Parámetros en Programación
Clase 11 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
Viendo ahora - 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#
04:16 min - 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
Mejora el rendimiento y la claridad del código en C# al controlar qué objetos cargar, evitar sobrecarga innecesaria y devolver múltiples valores con precisión. Con parámetros opcionales, tuplas y parámetros de salida, se logra un método flexible que ahorra memoria y tiempo de ejecución sin perder trazabilidad en el depurador.
¿Cómo controlar qué objetos cargar con parámetros opcionales?
La idea central es hacer granular la carga de datos de la escuela: evaluaciones, alumnos, asignaturas y cursos. Se parte de una sobrecarga existente y se evoluciona hacia una sola firma con parámetros opcionales booleanos que por defecto son verdaderos. Así, se evita la duplicación y se gana flexibilidad.
- Escuela siempre incluida.
- Flags: traerEvaluaciones, traerAlumnos, traerAsignaturas, traerCursos.
- Mejor rendimiento: no se cargan objetos que no se necesitan.
Código base con parámetros opcionales y lógica condicional:
List<ObjetoEscuela> GetObjetosEscuela(
bool traerEvaluaciones = true,
bool traerAlumnos = true,
bool traerAsignaturas = true,
bool traerCursos = true)
{
var lista = new List<ObjetoEscuela>();
lista.Add(escuela); // escuela siempre.
if (traerCursos)
{
lista.AddRange(escuela.Cursos);
foreach (var curso in escuela.Cursos)
{
if (traerAsignaturas) lista.AddRange(curso.Asignaturas);
// Si no traigo alumnos pero sí evaluaciones, igual recorro alumnos.
if (traerAlumnos || traerEvaluaciones)
{
foreach (var alumno in curso.Alumnos)
{
if (traerAlumnos) lista.Add(alumno);
if (traerEvaluaciones) lista.AddRange(alumno.Evaluaciones);
}
}
}
}
return lista;
}
¿Qué ventaja ofrecen los parámetros opcionales?
- Una sola firma en lugar de múltiples sobrecargas.
- Llamadas más legibles y flexibles.
- Menos objetos en memoria cuando no se requieren.
¿Cómo se verifica el resultado con el depurador?
- Con todo activado: la lista mostró 1622 objetos cargados, incluyendo evaluaciones.
- Sin evaluaciones: el resultado bajó a 88 objetos.
- Todo en false: se obtuvo 1 objeto: la escuela Platzi Academy.
¿Qué pasa si no traigo alumnos pero sí evaluaciones?
- No se agregan alumnos a la lista.
- Se recorre cada curso y sus alumnos para sumar o agregar evaluaciones.
- La lógica de negocio se mantiene sin poblar entidades innecesarias.
¿Cómo devolver múltiples valores: tuplas o parámetros de salida?
Se exploran dos enfoques para conocer cuántos elementos se cargan por tipo. Primero, una tupla que devuelve la lista y el conteo de evaluaciones. Luego, parámetros de salida para obtener todos los conteos: evaluaciones, asignaturas, alumnos y cursos.
¿Cómo usar tuplas para lista y conteo?
- Se acumula el conteoEvaluaciones sumando alumno.Evaluaciones.Count.
- La firma devuelve: (lista, conteoEvaluaciones).
(List<ObjetoEscuela> lista, int conteoEvaluaciones) GetObjetosEscuela(
bool traerEvaluaciones = true,
bool traerAlumnos = true,
bool traerAsignaturas = true,
bool traerCursos = true)
{
var lista = new List<ObjetoEscuela>();
int conteoEvaluaciones = 0;
lista.Add(escuela);
if (traerCursos)
{
lista.AddRange(escuela.Cursos);
foreach (var curso in escuela.Cursos)
{
if (traerAsignaturas) lista.AddRange(curso.Asignaturas);
if (traerAlumnos || traerEvaluaciones)
{
foreach (var alumno in curso.Alumnos)
{
if (traerAlumnos) lista.Add(alumno);
if (traerEvaluaciones)
{
lista.AddRange(alumno.Evaluaciones);
conteoEvaluaciones += alumno.Evaluaciones.Count;
}
}
}
}
}
return (lista, conteoEvaluaciones);
}
- Si traerEvaluaciones es false: el conteo es 0.
- Si es true: se observaron 960 evaluaciones como conteo total.
¿Cuándo preferir parámetros de salida out?
- Cuando se requieren varios conteos a la vez con una sola pasada.
- Regla en C#: los parámetros opcionales deben ir al final, los requeridos primero.
- Obligatorio asignar todos los parámetros marcados con out.
List<ObjetoEscuela> GetObjetosEscuela(
out int conteoEvaluaciones,
out int conteoAsignaturas,
out int conteoAlumnos,
out int conteoCursos,
bool traerEvaluaciones = true,
bool traerAlumnos = true,
bool traerAsignaturas = true,
bool traerCursos = true)
{
conteoEvaluaciones = conteoAsignaturas = conteoAlumnos = 0; // asignación múltiple.
conteoCursos = traerCursos ? escuela.Cursos.Count : 0;
var lista = new List<ObjetoEscuela>();
lista.Add(escuela);
if (traerCursos)
{
lista.AddRange(escuela.Cursos);
foreach (var curso in escuela.Cursos)
{
if (traerAsignaturas)
{
lista.AddRange(curso.Asignaturas);
conteoAsignaturas += curso.Asignaturas.Count;
}
if (traerAlumnos || traerEvaluaciones)
{
foreach (var alumno in curso.Alumnos)
{
if (traerAlumnos) lista.Add(alumno);
if (traerEvaluaciones)
{
lista.AddRange(alumno.Evaluaciones);
conteoEvaluaciones += alumno.Evaluaciones.Count;
}
}
conteoAlumnos += curso.Alumnos.Count;
}
}
}
return lista;
}
¿Qué habilidades y conceptos se fortalecen?
- Sobrecarga de métodos: cuándo evitarla con parámetros opcionales.
- Parámetros opcionales: valores por defecto para controlar carga.
- Parámetros de salida (out): múltiples resultados garantizados por contrato.
- Tuplas: retorno compacto de varios valores.
- Control de flujo con if y foreach: decisiones granulares por entidad.
- Acumuladores y conteos: sumas incrementales con Count.
- Firma del método: orden correcto de parámetros requeridos y opcionales.
- Depuración: verificación de tamaños de lista y conteos.
- Rendimiento: evitar poblar listas innecesariamente.
- Próximo objetivo: diccionario de datos con una enumeración para clasificar objetos.
¿Qué se anticipa con enumeración y diccionario de datos?
Se prepara la creación de un diccionario de datos basado en una enumeración para clasificar y acceder a colecciones por tipo. Este enfoque facilita consultas específicas y organiza la estructura de datos para escenarios de lógica compleja.
¿Te gustaría sugerir casos de uso para los conteos o proponer la estructura de la enumeración? Comparte tus ideas en los comentarios.