c# .net

¿Cuál es la diferencia entre myCustomer.GetType() y typeof(Customer) en C#?



.net (7)

He visto ambas cosas en algún código que estoy manteniendo, pero no sé la diferencia. ¿Hay alguno?

déjenme agregar que myCustomer es una instancia de Cliente


El operador typeof toma un tipo como parámetro. Se resuelve en tiempo de compilación. El método GetType se invoca en un objeto y se resuelve en tiempo de ejecución. El primero se usa cuando necesita usar un Tipo conocido, el segundo es para obtener el tipo de un objeto cuando no sabe de qué se trata.

class BaseClass { } class DerivedClass : BaseClass { } class FinalClass { static void RevealType(BaseClass baseCla) { Console.WriteLine(typeof(BaseClass)); // compile time Console.WriteLine(baseCla.GetType()); // run time } static void Main(string[] str) { RevealType(new BaseClass()); Console.ReadLine(); } } // ********* By Praveen Kumar Srivastava


GetType () se utiliza para encontrar el tipo real de una referencia de objeto en tiempo de ejecución. Esto puede ser diferente del tipo de la variable que hace referencia al objeto, debido a la herencia. typeof () crea un literal Type que es del tipo exacto especificado y se determina en tiempo de compilación.


Para el primero, necesita una instancia real (es decir, myCustomer), para el segundo no necesita


Sí, hay una diferencia si tiene un tipo heredado del Cliente.

class VipCustomer : Customer { ..... } static void Main() { Customer c = new VipCustomer(); c.GetType(); // returns typeof(VipCustomer) }


typeof (foo) se convierte en una constante durante el tiempo de compilación. foo.GetType () ocurre en tiempo de ejecución.

typeof (foo) también se convierte directamente en una constante de su tipo (es decir, foo), por lo que fallaría:

public class foo { } public class bar : foo { } bar myBar = new bar(); // Would fail, even though bar is a child of foo. if (myBar.getType == typeof(foo)) // However this Would work if (myBar is foo)


typeof se ejecuta en tiempo de compilación mientras GetType en tiempo de ejecución. Eso es lo que es tan diferente acerca de estos dos métodos. Es por eso que cuando maneja la jerarquía de tipos, puede averiguar el nombre exacto de un tipo simplemente ejecutando GetType.

public Type WhoAreYou(Base base) { base.GetType(); }


El resultado de ambos es exactamente el mismo en tu caso. Será su tipo personalizado que se deriva de System.Type . La única diferencia real aquí es que cuando desea obtener el tipo de una instancia de su clase, usa GetType . Si no tiene una instancia, pero conoce el nombre del tipo (y solo necesita el tipo de sistema real para inspeccionar o comparar), usaría typeof .

Diferencia importante

EDITAR: Permítame agregar que la llamada a GetType se resuelve en tiempo de ejecución, mientras que typeof se resuelve en tiempo de compilación.