Crea una cuenta o inicia sesión

¡Continúa aprendiendo sin ningún costo! Únete y comienza a potenciar tu carrera

Lista de Objetos polimórfica

6/35
Recursos

Vamos a crear un método que nos regrese todos los objetos Escuela de la escuela a través de un List de ObjetoEscuelaBase.

En C# podemos realizar validaciones sobre el tipo de objeto que estamos manejando, usando las siguientes palabras clave:

  • is, para verificar si un objeto es de un tipo en específico.
  • as, para tratar un objeto como un tipo específico, en caso de no poder convertir el objeto entonces va a asignar un valor null.

Aportes 28

Preguntas 7

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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.

Menos código

	   var obj = new Alumno();
            if((obj as Alumno) != null){
                //puedo usar objeto un alumno
            }

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

al tratarse de varios cursos se agrega AddRange en vez de Add

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:

object obj = "Hello";
string str = obj as string; // str = "Hello"

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.

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.

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

Ejemplo de codigo con as

<using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Estudiantes
{
    class Lista
    {
        public void checkList()
        {
            List<Estudiante> estudiante = new List<Estudiante>();
            Estudiante s = new Estudiante();
            s.Nombre = "Pepe Sofia";
            estudiante.Add(s);

            Object prueba = new Cerdo();
            Perro conversion= prueba as Perro;
            if (conversion == null)
            {
                Console.WriteLine("Conversion fue null");
            }
            

        }

        
    }

}
>

Resultado

‘Estudiantes.exe’ (CLR v4.0.30319: DefaultDomain): ‘C:\Windows\Microsoft.Net\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\Microsoft.Net\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\Microsoft.Net\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\Microsoft.Net\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\Microsoft.Net\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\Microsoft.Net\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\Microsoft.Net\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

La forma que yo veo mas fácil de entender esto es teniendo en cuenta los conceptos de stack y heap dejo un enlace:
https://danielarancibia.wordpress.com/2013/12/15/tipos-de-datos-en-net-c-vb-net/

apenas veo esto y me quedo mal en la evaluación del curso anterior 😦

Les comparto este video, me ayudo a interiozar “is, as” https://www.youtube.com/watch?v=IKmRtJcRX_

Palabra clave as, permite asegurar que un objeto sea compatible con otro. Se puede leer asigne este objeto como si fuera otro

Concepto aprendido
Para hacer una pregunta o una asignación:
is: para preguntar si un objeto es de un tipo determinado.
as: tomar el segundo objeto(Alumno), como si fuera el primero (obj). Si se puede lograr me va a devolver información. Si no lo puede lograr, me devuelve null.

Muy interesante

En este caso este seria un ejemplo para el caso de as y is

<using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Estudiantes
{
    class Lista
    {
        public void checkList()
        {
            List<Estudiante> estudiante = new List<Estudiante>();
            Estudiante s = new Estudiante();
            s.Nombre = "Pepe Sofia";
            estudiante.Add(s);

#pragma warning disable CS0184 // La expresión dada de la expresión "is" nunca tiene el tipo provisto
            if (estudiante is Estudiante)
            {
#pragma warning restore CS0184 // La expresión dada de la expresión "is" nunca tiene el tipo provisto
                Console.WriteLine("Esta correcto el objeto");
            }



            if (ValidarCampo(estudiante))
            {
                Console.WriteLine("Esta correcto el objeto");
            }

        }

        private static bool ValidarCampo(List<Estudiante> estudiante)
        {
            return estudiante as Perro;
        }
    }

}
>

Chido…


            //COMO EVITAR ERRORES EN TIEMPO DE EJECUCIÓN
            ob = evaluacion; // ob es de tipo Evaluacion
            if (ob is Alumno)
            {
                Alumno alumnoRecuperado = (Alumno)ob;
            }

            // SI NO LO PUEDE CONVERTIR DE VUELVE NULL
            Alumno alumnoRecuperado2 = ob as Alumno;

Muy interesantisimo

De está forma se pueden ahorrar un if para validar si es null.
El operador (?) valida si el objeto, si no es null entonces se puede acceder directamente a la propiedad de dicho objeto.

var objBase = new ObjetoEscuelaBase();
var al = new Alumno();
al.Nombre = "Dennis";
var ev = new Evaluacion();
ev.Nombre = "Matemática";
objBase = al;
objBase = ev;
               
var nomb = (objBase as Alumno)?.Nombre;

Muy interesante!

como 2 horas luchando con mi codigo hasta que por fin me queda como el profesor jajajaja

Otra alternativa de hacer uso de alumnoRecuperado2 seria: if (obj is Alumno alumnoRecuperado2) { //TODO }

F, Yo como loco buscando la respuesta en mis notas del curso pasado, Gran clase ♥