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.