Está en la página 1de 30

Tutorial de C#

Tipos de Datos

Por: Óscar López, M.Sc.


olopez@uniandino.com.co
¿Qué es un Tipo de Dato?

„ ¿Una clase?
„ ¿Una estructura?
„ ¿Una interfaz?
„ ¿Un delegado?
„ ¿Un tipo básico?
„ ¿Un protocolo?
„ ¿Puede un objeto tener más de un tipo?

OALP-2004 All Rights Reserved


¿Qué es un Tipo de Dato?

“El conjunto de mensajes a los que, en un


momento dado, puede responder un
objeto durante el tiempo de ejecución”

OALP-2004 All Rights Reserved


Tipos de Datos en C#
„ C# es un lenguaje fuerte y estáticamente tipado
„ Todos los objetos que se crean y se usan en un
programa tienen un tipo
„ Todo puede ser tratado como un objeto, aún los tipos
básicos
„ Cada tipo de C# corresponde a un tipo .NET
„ Se pueden clasificar como:
… Tipos valor (incluyen tipos básicos, también denominados
simples o primitivos)
… Tipos referencia
… Tipos puntero
„ Otra posible clasificación:
… Tipos intrínsecos, incorporados en el lenguaje (tipos básicos +
Object + String)
… Tipos definidos por el usuario
OALP-2004 All Rights Reserved
Categorización de Tipos de Datos

OALP-2004 All Rights Reserved


Tipos Valor vs. Tipos Referencia
„ La principal diferencia entre tipos valor y tipos
referencia es la forma en que sus valores son
almacenados en memoria
„ Una variable de tipo valor guarda su valor en memoria
asignada en la pila
„ El recolector de basura destruye los objetos en la pila
un tiempo después de que el frame de pila en el que
fueron declarados termina
„ Una variable de tipo referencia almacena su dirección
en la pila, pero el objeto propiamente dicho se
encuentra en el heap
„ Los objetos en el heap son recolectados un tiempo
después de que la última referencia a éstos haya sido
destruida

OALP-2004 All Rights Reserved


Tipos Valor
„ Se refieren a tipos en la pila
„ Además de los tipos básicos, se incluyen otros
tipos especiales como enumeraciones y
estructuras
„ C# tiene 13 tipos básicos, contando con tipos
sin signo y un tipo para cálculos de alta
precisión
„ De ser necesario, los tipos básicos se pueden
convertir a Object
„ No pueden ser null
„ Son pasados “por valor” a los métodos (es
decir, son copiados)
OALP-2004 All Rights Reserved
Tipos Básicos

Tipo Rango Tamaño Tipo .NET


sbyte -128 a 127 1 SByte
byte 0 a 255 1 Byte
short -32768 a 32767 2 Int16
ushort 0 a 65535 2 UInt16
int -231 a 231-1 4 Int32
uint 0 a 232-1 4 UInt32
long -263 a 263-1 8 Int64

OALP-2004 All Rights Reserved


Tipos Básicos
Tipo Rango Tamaño Tipo .NET

ulong 0 a 264-1 8 UInt64


-3.4E38 a -1.4E-45 para valores negativos
float
1.4E-45 to 3.4E38 para valores positivos
4 Single
con 7 dígitos significativos
-1.8E308 a -4.9E-324 para valores negativos
double
4.9E-324 a 1.8E308 para valores positivos
8 Double
con 15-16 dígitos significativos
±1.0E-28 a ±7.9E28
decimal
precisión fija con 28-29 dígitos significativos
16 Decimal
y la posición del punto decimal

char 1 cáracter Unicode 2 Char

bool true o false 1 Boolean

OALP-2004 All Rights Reserved


Tipos Básicos - Numéricos
„ Se pueden clasificar como “con signo” y “sin
signo”
„ También, como tipos de valores enteros y de
valores de punto flotante
„ Por razones de eficiencia, es preferible usar
tipos con signo y con un tamaño soportado
directamente a nivel de hardware
„ Si no se especifica un cáracter especial post-
fijo, todos los tipos de punto flotante se
consideran double y los enteros int
„ Se puede usar la notación 0xNNNN para
representar números hexadecimales
OALP-2004 All Rights Reserved
Caracteres Especiales Post-Fijos

cáracter Tipo Ejemplo


L long long temp = 999L

U uint uint temp = 999U

UL ulong ulong temp = 999UL

F float float temp = 9.99F

M decimal decimal temp = 9.99M

OALP-2004 All Rights Reserved


Tipos Básicos - decimal
„ Es un nuevo tipo de C#, representado usando 128 bits
„ Apropiado para cálculos científicos o financieros que
requieran un alto nivel de precisión
„ Para decimales con un valor absoluto menor que 1.0,
el valor representado es exacto hasta la 28va cifra
decimal; para decimales con un valor absoluto igual o
mayor que 1.0, el valor es exacto hasta la cifra 28 ó 29
„ Notar que un tipo decimal tiene mayor precisión pero
menor rango que un float o un double, así que no se
puede hacer una conversión implícita de un float o un
double a un decimal. Igualmente, no se puede hacer
una conversión implícita de un decimal a un float o a
un double

OALP-2004 All Rights Reserved


Tipos Básicos - char
„ Almacenan un solo cáracter, bien sea como su
representación literal (‘A’), un cáracter Unicode
(‘\u0041’) -o su correspondiente valor ASCII en
octal o hexadecimal- o una secuencia de
escape (‘\n’)
„ Internamente, un tipo char en C# siempre es
representado usando caracteres Unicode de
16 bits, no como un ASCII de 8 bits
„ Se puede usar la notación \uNNNN para
representar caracteres Unicode, \0NN para
caracteres ASCII en octal y \xNN para
caracteres ASCII en hexadecimal

OALP-2004 All Rights Reserved


Secuencias de Caracteres de Escape
Secuencia de Escape Cáracter Representado
\’ Comilla sencilla
\” Comilla doble
\\ Backslash
\0 null
\a Alerta (beep)
\b Retroceso
\f Alimentación de formulario
\n Nueva línea
\r Retorno del carro
\t Tabulación horizontal
\v Tabulación vertical
\cN cáracter de control ASCII

OALP-2004 All Rights Reserved


Tipos Referencia
„ Se refieren a tipos en el heap
„ Son seguros: es imposible que una variable de
tipo referencia se refiera a una posición
aleatoria, no-asignada de memoria
„ La única forma de acceder posiciones de
memoria directamente es usando tipos
punteros en código inseguro
„ Los tipos referencia pueden ser: clases,
interfaces, arreglos, delegados
„ Un tipo referencia puede referirse a una
instancia de un tipo o a null
OALP-2004 All Rights Reserved
Obteniendo el Tipo de un Objeto

„ Las instancias de System.Type representan el


tipo de un objeto
„ Sólo hay un objeto System.Type por cada tipo
(singleton)
„ El operador typeof retorna un objeto
System.Type que representa un tipo
„ Atención: typeof sólo puede ser aplicado a
nombres de tipos – no a objetos
„ typeof es evaluado durante el tiempo de
compilación
OALP-2004 All Rights Reserved
typeof - Ejemplo
1. using System;

2. interface IMyInterface {}
3. struct MyStruct {}
4. class ClassA : IMyInterface {}

5. namespace MyNamespace {

6. class Test {

7. public static void Main() {

8. Type t1 = typeof(int);
9. Type t2 = typeof(decimal);
10. Type t3 = typeof(string);
11. Type t4 = typeof(object);
12. Type t5 = typeof(IMyInterface);
13. Type t6 = typeof(MyStruct);
14. Type t7 = typeof(ClassA);
15. Type t8 = typeof(MyNamespace.Test);
16. // Type t9 = typeof(new Test());

17. Console.WriteLine(t1);
18. Console.WriteLine(t2);
19. Console.WriteLine(t3);
20. Console.WriteLine(t4);
21. Console.WriteLine(t5);
22. Console.WriteLine(t6);
23. Console.WriteLine(t7);
24. Console.WriteLine(t8);

25. Console.ReadLine();

26. }

27. }

28. }

OALP-2004 All Rights Reserved


typeof, Type.GetType() y Object.GetType()

„ La clase System.Type tiene un método estático, GetType(),


funcionalmente similar a typeof. Sin embargo, recibe como parámetro
una cadena de texto con el nombre de un tipo y es evaluada durante el
tiempo de ejecución
„ Recordar: System.Object tiene un método de instancia GetType(). A
diferencia de typeof y de Type.GetType(), opera sobre instancias de
objetos

typeof Object.GetType() Type.GetType()

Parámetro nombre de tipo receptor: nombre del nombre de tipo


objeto (como cadena)
Ejecución tiempo de compilación tiempo de ejecución tiempo de ejecución

Ejemplo typeof(MiClase) miClase.GetType() Type.GetType("MiClase")

OALP-2004 All Rights Reserved


Operador checked
checked {<bloque de código>}
checked (<expresión>)

„ Útil para detectar desbordamientos en operaciones


aritméticas entre enteros y en conversiones
„ Un desbordamiento ocurre cuando se trata de
almacenar un valor entero que excede el rango del
tipo de dato de una variable entera
„ Si una operación causa un desbordamiento en un
bloque checked se lanza una excepción
System.OverflowException, en caso contrario el
programa continúa pero con un valor “equivocado”
„ Puede anidarse dentro de un bloque unchecked

OALP-2004 All Rights Reserved


Operador unchecked
unchecked {<bloque de código>}
unchecked (<expresión>)

„ Algunos desbordamientos pueden detectarse durante


el tiempo de compilación, otros sólo aparecen durante
el de ejecución
„ Si un desbordamiento se detecta en compilación, la
compilación falla
„ Si se desea forzar al compilador a que acepte el
desbordamiento, se puede poner el código que lo
causa dentro de un bloque unchecked
„ Funciona con tipos int, uint, long, ulong
„ Puede anidarse dentro de un bloque checked

OALP-2004 All Rights Reserved


checked y unchecked - Ejemplo
1. using System;

2. class MyClass {

3. public static void Main() {

4. // desbordamiento en tiempo de ejecución


5. int i = 2147483647;
6. int j = i + 1;
7. Console.WriteLine(j);

8. // desbordamiento en tiempo de compilación


9. int k = 2147483647 + 1;
10. Console.WriteLine(k);

11. checked {
12. int l = 2147483647;
13. int m = l + 1; // System.OverflowException
14. Console.WriteLine(m);
15. }

16. unchecked {
17. int n = 2147483647 + 1;
18. Console.WriteLine(n);
19. }

20. Console.ReadLine();

21. }

22. }

OALP-2004 All Rights Reserved


Boxing
„ Todos los tipos -incluyendo los tipos valor- pueden ser
tratados como objetos, en últimas, derivados de
System.Object
„ Se denomina boxing al proceso por el cual un tipo
valor es convertido a un objeto (tipo referencia)
„ Puede realizarse de manera implícita o explícita
„ Es distinto de convertir un tipo referencia al tipo
System.Object, ya que al hacer boxing se debe crear
un nuevo objeto en el heap, al cual se le copia el valor
del tipo valor
„ Este mecanismo está presente por razones de
eficiencia

OALP-2004 All Rights Reserved


Boxing - Ejemplo
1. using System;

2. public class Test {

3. public static void Main() {

4. int i = 99;

5. // boxing explícito
6. object o = (object)i;
7. Console.WriteLine(o.ToString());
8. Console.WriteLine(o.GetType());

9. // boxing implícito
10. Console.WriteLine(i.ToString());
11. Console.WriteLine(i.GetType());

12. Console.ReadLine();

13. }

14. }

OALP-2004 All Rights Reserved


Unboxing

„ Proceso opuesto al boxing: es la conversión


de un objeto (tipo referencia) a un tipo valor,
usualmente, de manera explícita
„ La instancia a la cual se le realiza el unboxing
es chequeada para asegurarse que su tipo
original iguala al tipo objetivo

1. int i = 99;
2. object boxed = (object)i; // boxing
3. int j = (int)boxed; // unboxing

OALP-2004 All Rights Reserved


Unboxing - Ejemplo
„ Este código lanzaría una excepción
InvalidCastException durante el tiempo de ejecución,
ya que el tipo original del objeto no es short

1. int i = 99;
2. object boxed = (object)i; // boxing
3. short j = (short)boxed; // InvalidCastException

„ Aún si se trata de convertir un objeto a un tipo de rango


mayor al del original, se obtiene una excepción

1. int i = 99;
2. object boxed = (object)i; // boxing
3. double j = (double)boxed; // InvalidCastException

OALP-2004 All Rights Reserved


Conversiones

„ Objetos de un tipo pueden convertirse a otro


tipo, implícita o explícitamente
„ Las conversiones implícitas entre tipos básicos
(de “ensanchamiento”) son automáticas: el
compilador las realiza y garantiza que no haya
pérdida de información
„ Las conversiones explícitas ocurren cuando se
especifica un nuevo tipo entre paréntesis
delante de una expresión. Puede existir
pérdida de información
OALP-2004 All Rights Reserved
Conversiones Implícitas Válidas

OALP-2004 All Rights Reserved


Conversiones Explícitas de Tipos Valor

„ Las conversiones de “estrechamiento”


ocurren cuando se convierte de un tipo
de datos de mayor rango a uno de
menor rango
„ Deben hacerse explícitamente
„ Recordar el caso especial de Decimal:
se debe hacer una conversión explícita
en ambos sentidos con float y double

OALP-2004 All Rights Reserved


Conversiones Explícitas - Ejemplo
1. using System;

2. public class Test {

3. public static void Main(string []args) {

4. // Las conversiones son explícitas, y se pierde información


5. double d = 1.11111111;
6. float f = (float)d;
7. ulong ul = (ulong)f;

8. Console.WriteLine(d);
9. Console.WriteLine(f);
10. Console.WriteLine(ul);

11. // Una conversión también puede causar un desbordamiento


12. int i = -32769;
13. short s = (short)i; // el rango de s es -32768 a 32767
14. uint ui = (uint)i; // el rango de ui es 0 a 4294967295

15. Console.WriteLine(i);
16. Console.WriteLine(s);
17. Console.WriteLine(ui);

18. Console.ReadLine();

19. }

20. }
OALP-2004 All Rights Reserved
Conversiones Explícitas de Tipos Referencia

„ Un objeto puede convertirse a una de


sus super-clases de manera segura
„ Lo opuesto no es cierto: una super-clase
no puede convertirse a una sub-clase,
esto lanzaría una excepción
System.InvalidCastException
„ Ej: una manzana es una fruta, pero una
fruta no necesariamente es una
manzana
OALP-2004 All Rights Reserved

También podría gustarte