Domina conversiones seguras en C# con los operadores is y as, evita excepciones en tiempo de ejecución y aprende a construir un método que recolecta todos los objetos de una escuela en una sola lista. Con un enfoque práctico en Visual Studio Code y apoyo del debugger, verás cómo blindar tu código y preparar el terreno para clasificar objetos por tipo.
¿Cómo evitar excepciones al convertir tipos en C# con is y as?
Usar conversiones sin validar dispara errores en tiempo de ejecución. La estrategia es sencilla: primero comprueba el tipo, luego convierte. Con is verificas compatibilidad y con as obtienes el objeto o nul sin romper la ejecución.
¿Cuándo usar is?
El patrón es comprobar y hacer casting explícito. Si no coincide, no ejecuta y evitas la excepción.
if(objeto isAlumno){var alumnoRecuperado =(Alumno)objeto;// Conversión segura tras validar.// Usar alumnoRecuperado.}
Puntos clave:
is confirma si el objeto es de un tipo específico.
Si no coincide, el bloque no se ejecuta y no hay excepción.
Útil cuando necesitas lógica condicionada al tipo.
¿Cuándo usar as?
as intenta convertir y, si no puede, devuelve nul. No lanza excepción y el flujo es más limpio. Según la explicación, es la opción más recomendada por su claridad y menor código.
var alumnoRecuperado2 = objeto asAlumno;if(alumnoRecuperado2 !=null){// Usar alumnoRecuperado2 con confianza.}
Buenas prácticas:
Siempre valida nul tras usar as.
Evita conversiones directas sin verificación previa.
Prefiere as cuando luego vas a usar el objeto convertido.
¿Cómo construir un método para obtener todos los objetos de escuela?
La meta: devolver una colección con todos los elementos del modelo escolar. La escuela en sí, sus cursos, asignaturas, alumnos y evaluaciones. Se propone un método público que retorna List<ObjetoEscuelaBase>.
¿Qué objetos incluye la colección?
La lista debe agrupar todo lo que compone la escuela.
La escuela como objeto raíz.
Los cursos de la escuela.
Las asignaturas de cada curso.
Los alumnos de cada curso.
Las evaluaciones de cada alumno.
¿Cómo recorrer cursos, alumnos y evaluaciones?
Se inicia con la escuela, se agregan los cursos, luego se navega con foreach para sumar asignaturas, alumnos y, finalmente, evaluaciones.
publicList<ObjetoEscuelaBase>GetObjetosDeEscuela(){var listaObj =newList<ObjetoEscuelaBase>();// 1) Escuela. listaObj.Add(this);// La escuela actual.// 2) Cursos. listaObj.AddRange(Cursos);// 3) Asignaturas, alumnos y evaluaciones.foreach(var curso in Cursos){ listaObj.AddRange(curso.Asignaturas); listaObj.AddRange(curso.Alumnos);foreach(var alumno in curso.Alumnos){ listaObj.AddRange(alumno.Evaluaciones);}}return listaObj;}
Claves de implementación:
Usa Add para la escuela y AddRange para colecciones.
Recorre con foreach para aplanar jerarquías.
Retorna la lista completa para reportes o inspección.
¿Qué limitaciones tiene la lista y por qué pensar en un diccionario por tipo?
Al ejecutar y depurar, se obtiene una lista con todos los objetos. Se reportó un volumen grande: 1181 objetos entre alumnos, cursos, asignaturas y evaluaciones. El debugger muestra tipos, pero poca información inmediata de cada instancia.
Limitaciones observadas:
La lista mezcla tipos y no facilita filtrado inmediato por clase.
En el debugger, identificar detalles requiere abrir cada elemento.
Para reportes, es útil obtener solo cursos, o solo asignaturas, sin recorrer todo.
Propuesta de mejora:
Cambiar la salida de lista a diccionario que clasifique intencionalmente por tipo.
Beneficios: acceso directo por categoría, filtrado inmediato, código más claro para reportes.
¿Te gustaría ver la clasificación por tipo con un diccionario y ejemplos prácticos de acceso? Cuéntame qué colección usarías y qué reportes te interesan generar.
Me acabo de dar cuenta que en este punto recién se meciona el "is, as" y en la evaluación del curso anterior, viene una pregunta sobre este tema. Me pareció interesante y me hizo investigar un poquito. Aunque al final me terminé equivocando en la respuesta, ahora si lo acabo de entender.
x2
X3 jaja tuve que leer la documentación porque esa no la sabía
Menos código
var obj =newAlumno();if((obj asAlumno)!=null){//puedo usar objeto un alumno}
Interesante!
Por qué el != se ve así? O:
Esta pregunta salía en el examen del curso anterior, ya decía yo que este tema no lo había visto. 😅
Recorrido alterno de los objetos utilizando lamda
En este caso considero que las clases abstractas como el poliformismo se emplea cuando se quiere tener un codigo estructura y organizado, ya que no es bueno emplear redudancia de codigo
Abstracta: Las clases abstractas son aquellas que por sí mismas no se pueden identificar con algo ‘concreto’ (no existen como tal en el mundo real), pero sí poseen determinadas características que son comunes en otras clases que pueden ser creadas a partir de ellas.
Poliformismo: Se refiere a aquello que cuenta o que puede adoptar múltiples formas
Gracias por tus aportes @alejandrogonz2e852228819845aa, son muy útiles.
Psdata: Que nombre tan largo.
😄
Cual es la diferencia entre ListaObj.add(Escuela); y ListaObj.addRange(Escuela.cursoss);
Un método sirve solo para agregar una elemento más y el segundo para agregar toda una lista de elementos.
¿En que caso se debe usar el polimorfismo?
Siempre que puedas, ayudar mejorar el diseño de tus aplicaciones, es unos de los pilares de la programación orientado a objetos
Yo pienso que uno de los usos mas importantes del polimorfismo es la capacidad que te dá de crear segmentos de código que puedan trabar con diferentes tipos de clases (relacionadas por herencia). Si el lenguaje no te permitiera esa flexibilidad seguramente trendias que buscar otros mecanismos para no redundar el código. Te dejo un enlace de Microsoft que lo explica con un buen ejemplo
Es curioso que en esta clase del curso especifiquen para que se usa “is” y “as”, pero aparezca en el examen del curso de fundamentos, creo que deberìan corregir esa parte.
al tratarse de varios cursos se agrega AddRange en vez de Add
Tengo una duda, porque en el ejemplo cuando asignábamos un objeto del tipo alumno a un objeto de su padre (ObjetoEscuelaBase) solo se veían las propiedades nombre y unique ID pero cuando hace esta asignación en la lista de objetos podemos ver todas las propiedades de los objetos hijos?
La sentencia as en C# se utiliza para realizar una conversión de tipo segura. Es similar a una conversión de tipo utilizando (Tipo), pero en lugar de generar una excepción de tipo invalido si la conversión no es posible, la sentencia as devolverá null. Por ejemplo:
En este ejemplo, obj se convierte a una variable de tipo string utilizando la sentencia as, y si la conversión no es posible, str se establecería en null.
Diferencias entre is y as
El operador "is" se utiliza para comprobar si un objeto es compatible con un determinado tipo. Si el objeto es compatible con el tipo, el operador "is" devuelve "true", de lo contrario, devuelve "false". Se utiliza principalmente para comprobar si un objeto es una instancia de una clase específica antes de realizar una operación con ella.
El operador "as", por otro lado, se utiliza para realizar una conversión segura de un objeto a un tipo específico. Si el objeto es compatible con el tipo, el operador "as" devuelve una referencia al objeto convertido, de lo contrario, devuelve "null". Se utiliza principalmente para convertir un objeto a un tipo específico antes de trabajar con él.
Es importante destacar que el uso de "as" solo debe realizarse cuando se está seguro de que el objeto puede ser convertido al tipo deseado, ya que si no es posible, el resultado será "null" y se puede producir un error si se intenta trabajar con ese objeto.
Aporte: ver el minuto 5:49
Si necesitamos hacer uso de alumnoRecuperado2 y asegurarnos que el mismo no sea nulo para evitar errores en tiempo de ejecucion, tambien podriamos hacer lo siguiente:
if(obj is Alumno alumnoRecuperado2){var nombre = alumnoRecuperado2.Nombre;//..//..}
Que buena clase, me recuerdo hace varios años en la universidad cuando estudiaba algoritmos genéticos e IA hacerme unos buenos mix de listas de varios tipos de objetos. Lo requería para cuando creaba generaciones de algoritmos que mutaban pasando a la siguiente generación y necesitaban sacar lo mejor de sus padres y así, en ese momento casi todo lo hacía intuitivamente sólo teniendo claro lo de boxing y unboxing
‘Estudiantes.exe’ (CLR v4.0.30319: DefaultDomain): ‘C:\Windows\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll’ cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador ‘Sólo mi código’ está habilitada.
‘Estudiantes.exe’ (CLR v4.0.30319: DefaultDomain): ‘C:\Users\Sem-6-INGENIERIAINDU\source\repos\Estudiantes\Estudiantes\bin\Debug\Estudiantes.exe’ cargado. Símbolos cargados.
‘Estudiantes.exe’ (CLR v4.0.30319: Estudiantes.exe): ‘C:\Windows\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll’ cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador ‘Sólo mi código’ está habilitada.
‘Estudiantes.exe’ (CLR v4.0.30319: Estudiantes.exe): ‘C:\Windows\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll’ cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador ‘Sólo mi código’ está habilitada.
‘Estudiantes.exe’ (CLR v4.0.30319: Estudiantes.exe): ‘C:\Windows\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll’ cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador ‘Sólo mi código’ está habilitada.
‘Estudiantes.exe’ (CLR v4.0.30319: Estudiantes.exe): ‘C:\Windows\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll’ cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador ‘Sólo mi código’ está habilitada.
‘Estudiantes.exe’ (CLR v4.0.30319: Estudiantes.exe): ‘C:\Windows\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll’ cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador ‘Sólo mi código’ está habilitada.
‘Estudiantes.exe’ (CLR v4.0.30319: Estudiantes.exe): ‘C:\Windows\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll’ cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador ‘Sólo mi código’ está habilitada.
1
1
1
1
1
Conversion fue null
Conversion fue null
Conversion fue null
apenas veo esto y me quedo mal en la evaluación del curso anterior :(
Muchos errores cuando grabaron el video, deberían validar bien estos cursos
Me esta sucediendo que no me devuelve el tipo de dato en la lista: CoreEscuela.Entidades.Evaluacion/Cursos/Alumnos... sino directamente lo que tiene el objeto.¿A alguien se le ocurre que puede ser?, el codigo esta identico al del curso.
comparte el codigo
puede ser que te hayas ido un par de clases más adelante donde se implementa el toString y se hace justamente lo que describes.