Saltar al contenido

¿Cuándo y dónde usar GetType() o typeof()?

este problema se puede abordar de diversas maneras, sin embargo te dejamos la solución más completa en nuestra opinión.

typeof es un operador para obtener un tipo conocido en tiempo de compilación (o al menos un parámetro de tipo genérico). El operando de typeof es siempre el nombre de un tipo o parámetro de tipo – nunca una expresión con un valor (por ejemplo, una variable). Consulte la especificación del lenguaje C# para obtener más detalles.

GetType() es un método que llamas a objetos individuales, para obtener el Tiempo de ejecución tipo del objeto.

Tenga en cuenta que a menos que Ud. solo quiere exactamente instancias de TextBox (en lugar de instancias de subclases) normalmente usaría:

if (myControl is TextBox)

    // Whatever

O

TextBox tb = myControl as TextBox;
if (tb != null)

    // Use tb

typeof se aplica a un nombre de tipo o parámetro de tipo genérico conocido en tiempo de compilación (dado como identificador, no como string). GetType se llama en un objeto en tiempo de ejecución. En ambos casos el resultado es un objeto del tipo System.Type que contiene metainformación sobre un tipo.

Ejemplo donde los tipos de tiempo de compilación y tiempo de ejecución son iguales

string s = "hello";

Type t1 = typeof(string);
Type t2 = s.GetType();

t1 == t2 ==> true

Ejemplo donde los tipos de tiempo de compilación y tiempo de ejecución son diferente

object obj = "hello";

Type t1 = typeof(object); // ==> object
Type t2 = obj.GetType();  // ==> string!

t1 == t2 ==> false

es decir, el tipo de tiempo de compilación (static tipo) de la variable obj no es lo mismo que el tipo de tiempo de ejecución del objeto al que hace referencia obj.


Tipos de prueba

Sin embargo, si sólo desea saber si mycontrol es un TextBox entonces puedes simplemente probar

if (mycontrol is TextBox)

Tenga en cuenta que esto no es completamente equivalente a

if (mycontrol.GetType() == typeof(TextBox))    

porque mycontrol podría tener un tipo que se deriva de TextBox. En ese caso, la primera comparación produce true y el segundo false! La primera y más fácil variante está bien en la mayoría de los casos, ya que un control derivado de TextBox hereda todo lo que TextBox tiene, probablemente le agrega más y, por lo tanto, es compatible con la asignación TextBox.

public class MySpecializedTextBox : TextBox



MySpecializedTextBox specialized = new MySpecializedTextBox();
if (specialized is TextBox)       ==> true

if (specialized.GetType() == typeof(TextBox))        ==> false

Fundición

Si tiene la siguiente prueba seguida de un lanzamiento y T es anulable…

if (obj is T) 
    T x = (T)obj; // The casting tests, whether obj is T again!
    ...

… puedes cambiarlo a …

T x = obj as T;
if (x != null) 
    ...

Probar si un valor es de un tipo dado y convertir (lo que implica esta misma prueba nuevamente) puede llevar mucho tiempo para largas cadenas de herencia. Utilizando el as operador seguido de una prueba de null es más eficaz.

A partir de C# 7.0, puede simplificar el código utilizando la coincidencia de patrones:

if (obj is T t) 
    // t is a variable of type T having a non-null value.
    ...

Por cierto: esto también funciona para los tipos de valor. Muy útil para probar y desempaquetar. Tenga en cuenta que no puede probar tipos de valores anulables:

if (o is int? ni) ===> does NOT compile!

Esto se debe a que el valor es null o es un int. esto funciona para int? o así como para object o = new Nullable(x);:

if (o is int i) ===> OK!

Me gusta, porque elimina la necesidad de acceder a la Nullable.Value propiedad.

typeOf es una palabra clave de C# que se usa cuando tiene el nombre de la clase. Se calcula en tiempo de compilación y, por lo tanto, no se puede usar en una instancia, que se crea en tiempo de ejecución. GetType es un método de la clase de objeto que se puede usar en una instancia.

Reseñas y calificaciones

Si para ti ha sido provechoso nuestro artículo, te agradeceríamos que lo compartas con más programadores de esta forma nos ayudas a difundir esta información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *