c# .net typeof gettype

c# - ¿Cuál es la diferencia de obtener Type al usar GetType() y typeof()?



.net (4)

GetType () funciona en tiempo de ejecución, typeof () es un operador en tiempo de compilación.

Asi que,

// untested, schematic void ShowType(Object x) { Write(x.GetType().Name); // depends on actual type // typeof(x) won''t actually compile Write(typeof(x).Name); // always System.Object } ShowType("test");

Imprimiré System.String y System.Object.

Vea esta pregunta para un mejor ejemplo.

Posible duplicado:
Comprobación de tipo: typeof, GetType, o es?

¿Cuál es la forma preferida de obtener el tipo?


GetType es un método virtual en Object: esto significa que, dada la instancia de una clase, puede recuperar el objeto Type correspondiente.

typeof es un operador de C #: se utiliza para realizar una búsqueda en tiempo de compilación, es decir, dado que un Símbolo representa un nombre de Clase, recupera el objeto Tipo para él.

if (typeof(String) == "test".GetType())


No es exactamente el mismo, y el problema aparece cuando usas la herencia.

Es decir:

WebPage1 hereda de Page , y éste también se hereda de Object , por lo que si prueba (new WebPage1()).GetType() == typeof(object) devolverá false porque los tipos son diferentes, pero cuando prueba usando El operador es cierto.

((new WebPage1()) is object) es verdadero porque (new WebPage1()) es un objeto de tipo WebPage1 , y también una Page y un object .

Los tipos pueden ser diferentes, pero is comprueba si puede lanzar de forma segura a este tipo.


Solo puede usar typeof() cuando conoce ese tipo en tiempo de compilación, y está tratando de obtener el objeto Type correspondiente. (Aunque el tipo podría ser un parámetro de tipo genérico, por ejemplo, typeof(T) dentro de una clase con un parámetro de tipo T ). No es necesario que haya ninguna instancia de ese tipo disponible para usar typeof . El operando para typeof es siempre el nombre de un tipo o parámetro de tipo. No puede ser una variable ni nada de eso.

Ahora compare eso con object.GetType() . Eso obtendrá el tipo real del objeto al que se llama. Esto significa:

  • No necesita saber el tipo en tiempo de compilación (y normalmente no lo hace)
  • Es necesario que haya una instancia del tipo (ya que de lo contrario no tiene nada a lo que llamar GetType )
  • El tipo real no necesita ser accesible a su código, por ejemplo, podría ser un tipo interno en un ensamblaje diferente

Un punto extraño: GetType dará respuestas inesperadas en tipos de valores que GetType debido a la forma en que funciona el boxeo. Una llamada a GetType siempre implicará encasillar cualquier tipo de valor, incluido un tipo de valor anulable, y el valor encuadrado de un tipo de valor anulable es una referencia nula o una referencia a una instancia de un tipo de valor no anulable.