viernes, 25 de abril de 2014

El Método GetType y el Operador typeof en C#

Tabla de Contenido

0. Introducción
1. El Método GetType
1.1 Clausura transitiva
2. El Operador typeof
2.1 Aplicaciones útiles
3. Ejemplo General
4. Conclusiones
5. Glosario
6. Enlaces & Literatura

0. Introducción

Es el momento de que nos centremos en un poco de teoría de algunas construcciones importantes del lenguaje C# para manipular tipos en tiempo de compilación y en tiempo de ejecución: el método GetType y el operador typeof. También conoceremos, grosso modo, el concepto de clausura transitiva en la relación de herencia de tipos de objetos.

1. El Método GetType

Los tipos de datos en C# cuentan con una clase de representación o delegado conocida como System.Type, la cual se puede ver como una instancia que conoce todo acerca de un tipo del Framework .NET o de los propios definidos por el usuario.

Continuando, esta es una construcción que nos permite y facilita obtener una instancia de System.Type. Este método lo encontramos en la clase base (raíz) de toda la jerarquía del Framework .NET, me refiero a Object: Object.GetType() [4].

Firma (o si prefieren: signature o signatura):

public Type GetType()

El tipo de retorno Type [5] corresponde con la clase de representación (o descripción) de tipos como:
  • Clases
  • Interfaces
  • Enumeraciones
  • Genéricos
  • Arreglos
  • Tipos numéricos
Esta clase posee toda la maquinaria necesaria para describir la implementación de los tipos anteriores. Por ejemplo, podemos conocer en tiempo de ejecución los métodos que pertenecen a un tipo, igualmente las propiedades, el tipo del objeto, la relación de un tipo en una jerarquía de herencia (descendencia), entre otras operaciones interesantes más.

1.1 Clausura transitiva

De acuerdo con [2, 3] la clausura transitiva impera en la relación de herencia de tipos. Por ejemplo veamos esta jerarquía de herencia:

class A
{
}

class B : A
{
}

class C : B
{
}

Veamos a la clausura transitiva como la relación que existe entre estas tres clases (AB, y C) de la siguiente manera:

Como C es un subtipo (deriva de) de B, y B deriva de A, entonces podemos concluir que C es un subtipo de A. Y no es más el concepto de clausura transitiva. [Nota: Si quiere conocer más acerca de esta relación matemática, ir a [3].]

1.2 Ejemplos

En este primer ejemplo vamos a demostrar el concepto de deducción de tipos en tiempo de ejecución en una jerarquía de herencia. Así:

Archivo GetTypeEnJerarquía.cs:



En las líneas 29-32 se crean instancias de la siguiente manera:
  • Línea 29: 
    • Identificador: cb
    • Tipo: ClaseBase
    • Instancia de: ClaseBase
  • Línea 30:
    • Identificador: cd
    • Tipo: ClaseDerivada
    • Instancia de: ClaseDerivada
  • Línea 31:
    • Identificador: o
    • Tipo: object
    • Instancia de: ClaseDerivada
  • Línea 32:
    • Identificador: cb2
    • Tipo: ClaseBase
    • Instancia de: ClaseDerivada
A continuación, líneas 35-38, se realiza las pruebas de identificación de tipos en tiempo de ejecución. Dado que GetType obtiene el tipo de la instancia, y no del tipo del identificador, obtenemos estos resultados:


El tipo de 'cb' es ClaseBase
El tipo de 'cd' es ClaseDerivada
El tipo de 'o' es ClaseDerivada
El tipo de 'cb2' es ClaseDerivada

> Prueba de ejecución.

2. El operador typeof

Mientras que GetType nos permite conocer tipos en tiempo de ejecución, typeof [5] determina los tipos en tiempo de compilación. Este operador nos devuelve una instancia de System.Type, el cual incluye toda la descripción completa del tipo (métodos, propiedades, detalles del tipo, relación de herencia, etc.).

Su uso es tan sencillo como en:

Console.WriteLine( typeof(int) ); // System.Int32
Console.WriteLine( typeof(byte) ); // System.Byte
Console.WriteLine( typeof(Stream) ); // System.IO.Stream
Console.WriteLine( typeof(TextWriter) ); // System.IO.TextWriter
Console.WriteLine( typeof(Array) ); // System.Array
Console.WriteLine( typeof(int[]) ); // System.Int32[]

En [5] nos describen que el operador typeof hace uso de reflection (en entregas posteriores haré hincapié en este importante concepto en programación) para acceder a la metadata (metadatos: descripción de la estructura del tipo) de los tipos.

2.1 Aplicaciones útiles

Extracto de [5]:
Some common uses of the typeof operator are the Enum static methods, the DataTable class and similar classes, the ArrayList conversion methods, and the HttpWorkerRequest methods used in ASP.NET. We provide further descriptions.

3. Ejemplo General

Veamos este ejemplo en donde se conjuga el uso de estas dos construcciones.

Archivo GetTypeYtypeof.cs:



> Prueba de ejecución.

Conclusiones

Hemos aprendido los conceptos fundamentales de la aplicación y utilidad de las construcciones GetType (método) y typeof (operador). La diferencia básica de estos dos radica en el contexto o tiempo: ejecución y compilación, respectivamente. También conocimos, grosso modo, el concepto de clausura transitiva en la jerarquía de herencia de tipos de datos.

Glosario

  • Tiempo de compilación
  • Tiempo de ejecución
  • Tipo

Enlaces & Literatura

[1]: C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.
[2]: C# GetType Method - http://www.dotnetperls.com/gettype
[3]: Clausura transitiva, la enciclopedia libre - http://es.wikipedia.org/wiki/Clausura_transitiva
[4]: Object.GetType Method (System) - http://msdn.microsoft.com/en-us/library/system.object.gettype%28v=vs.110%29.aspx
[5]: typeof (C# Reference) - http://msdn.microsoft.com/en-us/library/58918ffs.aspx
[6]: C# Typeof Operator - http://www.dotnetperls.com/typeof


J

1 comentario:

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.