Los tipos de C#
"En C#, todo está tipado"
El término genérico "tipo" agrupa las clases, estructuras, interfaces, enumeraciones y delegados. Estos cinco tipos se describen en la CTS (Common Type System) para que los compiladores de diferentes lenguajes puedan generar código explotable por la CLR (Common Language Runtime). Un programa utiliza diferentes tipos y un ensamblado puede implementar varios tipos.
A continuación se muestran las definiciones resumidas de los diferentes tipos propuestos por C#:
-
El tipo "Clase" es la implementación C# de lo que se ha presentado en los primeros capítulos. La clase evidentemente es el tipo más utilizado en las aplicaciones. El capítulo Creación de clases define de manera precisa la sintaxis de declaración, asignación y uso.
-
El tipo "Estructura" es una herencia del lenguaje C. Antes de la democratización de la programación orientada a objetos, las estructuras eran el medio más común para los desarrolladores para construir sus propios tipos. De momento, nos quedamos con que las estructuras de C# son muy cercanas a las clases y que, cuando se utilizan sabiamente, permiten mejorar el rendimiento de una aplicación. Veremos en el siguiente capítulo que el framework .NET integra la mayor parte de sus tipos "sencillos" en las estructuras. Sepa que las estructuras no existen en Java.
-
El tipo "Interfaz" es muy utilizado en el framework .NET y contribuye a la comunicación entre las clases. Por el momento...
"Todo el mundo hereda de System.Object"
El tipo System.Object es la base directa o indirecta de todos los tipos de .NET, tanto de los existentes como de los que se crean nuevos (la noción de herencia ya se ha abordado en los primeros capítulos). La herencia de Object es implícita y, por tanto, su declaración es inútil. Todos los tipos heredan de sus métodos e incluso pueden sustituir algunos.
Esto es lo que hace System.ValueType que, en la herencia de tipos de .NET, se convierte en la base de la familia "Valores", adaptándose a los métodos de System.Object.
1. Los tipos Valores
La familia "Valores" se divide en dos partes:
-
Las enumeraciones
-
Las estructuras
A su vez, las estructuras se dividen en:
-
Tipos numéricos:
-
Los tipos enteros:
Tipo |
Tamaño |
sbyte byte char short ushort int uint long ulong |
Entero con signo de 8 bits Entero sin signo de 8 bits Carácter UNICODE 16 bits Entero con signo de 16 bits Entero sin signo de 16 bits Entero con signo de 32 bits Entero sin signo de 32 bits Entero con signo de 64 bits Entero sin signo de 64 bits |
-
Los tipos de coma flotante:
Tipo |
Precisión |
float double |
7 dígitos 15-16 dígitos |
-
El tipo decimal (adaptado a los cálculos financieros):
Tipo |
Precisión |
decimal |
28-29 dígitos |
-
Tipo booleano: tipo bool.
-
Estructuras de usuario (son las que usted escribe). Observe que es el único medio de construir tipos Valores, porque la herencia del tipo System.ValueType está prohibida.
De hecho, los tipos "sencillos" enunciados en las tres tablas son alias a las estructuras del espacio System. Así hablamos de tipos valores integrados. Por tanto, se pueden declarar:
-
Indicando el nombre completo de la estructura (ejemplo: System.Int32).
-
Utilizando el alias que tiene asociado en la gramática de C# (ejemplo: int).
Un tipo Valor se debe inicializar antes de utilizarlo. De lo contrario, se producirá un error de compilación. El método más clásico consiste en continuar la definición con el signo de asignación y su valor inicial. También es posible instanciar un tipo Valor con ayuda de la palabra clave new. En este caso, se pasará por el constructor (se verá más adelante) por defecto del tipo. El constructor ajusta el valor a 0 para los tipos numéricos y a false para el tipo booleano....
Ejercicio corregido
1. Enunciado
Crear una aplicación de tipo Consola que servirá de soporte a las siguientes cuestiones:
Compruebe por programación que el tipo integrado int es el alias del tipo System.Int32.
Compruebe que int y System.Int32 son de tipo Valor.
Compruebe que string no es de tipo Valor.
Muestre en la consola el número de bytes utilizados para almacenar el valor de un tipo int.
2. Corrección
Seleccione el menú Archivo y después Nuevo proyecto. Indique la información solicitada.
El contenido del archivo fuente generado por el asistente es el siguiente:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Cap3
{
class Program
{
static void Main(string[] args)
{
}
}
}
Compruebe la igualdad de los tipos int y System.Int32 insertando siguiente el código en el Main:
// Prueba sin instanciación
System.Diagnostics.Debug.Assert(
typeof(int) == typeof(System.Int32)
); ...