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.