Vous êtes sur la page 1sur 30

Tutorial de C#

Tipos de Datos
Por: scar Lpez, M.Sc.
olopez@uniandino.com.co

Qu es un Tipo de Dato?

Una clase?
Una estructura?
Una interfaz?
Un delegado?
Un tipo bsico?
Un protocolo?
Puede un objeto tener ms 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 ejecucin

OALP-2004 All Rights Reserved

Tipos de Datos en C#

C# es un lenguaje fuerte y estticamente tipado


Todos los objetos que se crean y se usan en un
programa tienen un tipo
Todo puede ser tratado como un objeto, an los tipos
bsicos
Cada tipo de C# corresponde a un tipo .NET
Se pueden clasificar como:

Tipos valor (incluyen tipos bsicos, tambin denominados


simples o primitivos)
Tipos referencia
Tipos puntero

Otra posible clasificacin:

Tipos intrnsecos, incorporados en el lenguaje (tipos bsicos +


Object + String)
Tipos definidos por el usuario
OALP-2004 All Rights Reserved

Categorizacin 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 despus de que el frame de pila en el que
fueron declarados termina
Una variable de tipo referencia almacena su direccin
en la pila, pero el objeto propiamente dicho se
encuentra en el heap
Los objetos en el heap son recolectados un tiempo
despus de que la ltima referencia a stos haya sido
destruida
OALP-2004 All Rights Reserved

Tipos Valor

Se refieren a tipos en la pila


Adems de los tipos bsicos, se incluyen otros
tipos especiales como enumeraciones y
estructuras
C# tiene 13 tipos bsicos, contando con tipos
sin signo y un tipo para clculos de alta
precisin
De ser necesario, los tipos bsicos se pueden
convertir a Object
No pueden ser null
Son pasados por valor a los mtodos (es
decir, son copiados)
OALP-2004 All Rights Reserved

Tipos Bsicos
Tipo

Rango

Tamao

-128 a 127

SByte

0 a 255

Byte

-32768 a 32767

Int16

ushort

0 a 65535

UInt16

int

-231 a 231-1

Int32

uint

0 a 232-1

UInt32

long

-263 a 263-1

Int64

sbyte
byte
short

OALP-2004 All Rights Reserved

Tipo .NET

Tipos Bsicos
Tipo

Rango

Tamao

ulong

0 a 264-1

UInt64

float

-3.4E38 a -1.4E-45 para valores negativos


1.4E-45 to 3.4E38 para valores positivos
con 7 dgitos significativos

Single

double

-1.8E308 a -4.9E-324 para valores negativos


4.9E-324 a 1.8E308 para valores positivos
con 15-16 dgitos significativos

Double

decimal

1.0E-28 a 7.9E28
precisin fija con 28-29 dgitos significativos
y la posicin del punto decimal

16

Decimal

char

1 cracter Unicode

Char

bool

true o false

Boolean

OALP-2004 All Rights Reserved

Tipo .NET

Tipos Bsicos - Numricos

Se pueden clasificar como con signo y sin


signo
Tambin, como tipos de valores enteros y de
valores de punto flotante
Por razones de eficiencia, es preferible usar
tipos con signo y con un tamao soportado
directamente a nivel de hardware
Si no se especifica un cracter especial postfijo, todos los tipos de punto flotante se
consideran double y los enteros int
Se puede usar la notacin 0xNNNN para
representar nmeros hexadecimales
OALP-2004 All Rights Reserved

Caracteres Especiales Post-Fijos


cracter

Tipo

Ejemplo

long

long temp = 999L

uint

uint temp = 999U

UL

ulong

ulong temp = 999UL

float

float temp = 9.99F

decimal

decimal temp = 9.99M

OALP-2004 All Rights Reserved

Tipos Bsicos - decimal

Es un nuevo tipo de C#, representado usando 128 bits


Apropiado para clculos cientficos o financieros que
requieran un alto nivel de precisin
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 precisin pero
menor rango que un float o un double, as que no se
puede hacer una conversin implcita de un float o un
double a un decimal. Igualmente, no se puede hacer
una conversin implcita de un decimal a un float o a
un double
OALP-2004 All Rights Reserved

Tipos Bsicos - char

Almacenan un solo cracter, bien sea como su


representacin literal (A), un cracter 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 notacin \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

Cracter Representado

Comilla sencilla

Comilla doble

\\

Backslash

\0

null

\a

Alerta (beep)

\b

Retroceso

\f

Alimentacin de formulario

\n

Nueva lnea

\r

Retorno del carro

\t

Tabulacin horizontal

\v

Tabulacin vertical

\cN

cracter 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 posicin
aleatoria, no-asignada de memoria
La nica forma de acceder posiciones de
memoria directamente es usando tipos
punteros en cdigo 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
Slo hay un objeto System.Type por cada tipo
(singleton)
El operador typeof retorna un objeto
System.Type que representa un tipo
Atencin: typeof slo puede ser aplicado a
nombres de tipos no a objetos
typeof es evaluado durante el tiempo de
compilacin
OALP-2004 All Rights Reserved

typeof - Ejemplo
1.

using System;

2.
4.

interface IMyInterface {}
struct MyStruct {}
class ClassA : IMyInterface {}

5.

namespace MyNamespace {

3.

class Test {

6.

public static void Main() {

7.

Type t1
Type t2
Type t3
Type t4
Type t5
Type t6
Type t7
Type t8
// Type

8.
9.
10.
11.
12.
13.
14.
15.
16.

= typeof(int);
= typeof(decimal);
= typeof(string);
= typeof(object);
= typeof(IMyInterface);
= typeof(MyStruct);
= typeof(ClassA);
= typeof(MyNamespace.Test);
t9 = typeof(new Test());

24.

Console.WriteLine(t1);
Console.WriteLine(t2);
Console.WriteLine(t3);
Console.WriteLine(t4);
Console.WriteLine(t5);
Console.WriteLine(t6);
Console.WriteLine(t7);
Console.WriteLine(t8);

25.

Console.ReadLine();

17.
18.
19.
20.
21.
22.
23.

26.

27.
28.

OALP-2004 All Rights Reserved

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

La clase System.Type tiene un mtodo esttico, GetType(),


funcionalmente similar a typeof. Sin embargo, recibe como parmetro
una cadena de texto con el nombre de un tipo y es evaluada durante el
tiempo de ejecucin
Recordar: System.Object tiene un mtodo de instancia GetType(). A
diferencia de typeof y de Type.GetType(), opera sobre instancias de
objetos

typeof

Object.GetType()

Type.GetType()

Parmetro

nombre de tipo

receptor: nombre del


objeto

nombre de tipo
(como cadena)

Ejecucin

tiempo de compilacin

tiempo de ejecucin

tiempo de ejecucin

Ejemplo

typeof(MiClase)

miClase.GetType()

Type.GetType("MiClase")

OALP-2004 All Rights Reserved

Operador checked
checked {<bloque de cdigo>}
checked (<expresin>)

til para detectar desbordamientos en operaciones


aritmticas 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 operacin causa un desbordamiento en un
bloque checked se lanza una excepcin
System.OverflowException, en caso contrario el
programa contina pero con un valor equivocado
Puede anidarse dentro de un bloque unchecked
OALP-2004 All Rights Reserved

Operador unchecked
unchecked {<bloque de cdigo>}
unchecked (<expresin>)

Algunos desbordamientos pueden detectarse durante


el tiempo de compilacin, otros slo aparecen durante
el de ejecucin
Si un desbordamiento se detecta en compilacin, la
compilacin falla
Si se desea forzar al compilador a que acepte el
desbordamiento, se puede poner el cdigo 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 {
public static void Main() {

3.

// desbordamiento en tiempo de ejecucin


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

4.
5.
6.
7.

// desbordamiento en tiempo de compilacin


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

8.
9.
10.

checked {
int l = 2147483647;
int m = l + 1; // System.OverflowException
Console.WriteLine(m);
}

11.
12.
13.
14.
15.

19.

unchecked {
int n = 2147483647 + 1;
Console.WriteLine(n);
}

20.

Console.ReadLine();

16.
17.
18.

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 implcita o explcita
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 {


public static void Main() {

3.
4.

int i = 99;

5.

// boxing explcito
object o = (object)i;
Console.WriteLine(o.ToString());
Console.WriteLine(o.GetType());

6.
7.
8.

11.

// boxing implcito
Console.WriteLine(i.ToString());
Console.WriteLine(i.GetType());

12.

Console.ReadLine();

9.
10.

13.
14.

OALP-2004 All Rights Reserved

Unboxing

1.
2.
3.

Proceso opuesto al boxing: es la conversin


de un objeto (tipo referencia) a un tipo valor,
usualmente, de manera explcita
La instancia a la cual se le realiza el unboxing
es chequeada para asegurarse que su tipo
original iguala al tipo objetivo
int i = 99;
object boxed = (object)i; // boxing
int j = (int)boxed;
// unboxing
OALP-2004 All Rights Reserved

Unboxing - Ejemplo

Este cdigo lanzara una excepcin


InvalidCastException durante el tiempo de ejecucin,
ya que el tipo original del objeto no es short

1.

int i = 99;
object boxed = (object)i; // boxing
short j = (short)boxed;
// InvalidCastException

2.
3.

An si se trata de convertir un objeto a un tipo de rango


mayor al del original, se obtiene una excepcin

1.

int i = 99;
object boxed = (object)i; // boxing
double j = (double)boxed; // InvalidCastException

2.
3.

OALP-2004 All Rights Reserved

Conversiones

Objetos de un tipo pueden convertirse a otro


tipo, implcita o explcitamente
Las conversiones implcitas entre tipos bsicos
(de ensanchamiento) son automticas: el
compilador las realiza y garantiza que no haya
prdida de informacin
Las conversiones explcitas ocurren cuando se
especifica un nuevo tipo entre parntesis
delante de una expresin. Puede existir
prdida de informacin
OALP-2004 All Rights Reserved

Conversiones Implcitas Vlidas

OALP-2004 All Rights Reserved

Conversiones Explcitas 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 explcitamente
Recordar el caso especial de Decimal:
se debe hacer una conversin explcita
en ambos sentidos con float y double
OALP-2004 All Rights Reserved

Conversiones Explcitas - Ejemplo


1.

using System;

2.

public class Test {


public static void Main(string []args) {

3.

// Las conversiones son explcitas, y se pierde informacin


double d = 1.11111111;
float f = (float)d;
ulong ul = (ulong)f;

4.
5.
6.
7.

Console.WriteLine(d);
Console.WriteLine(f);
Console.WriteLine(ul);

8.
9.
10.

// Una conversin tambin puede causar un desbordamiento


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

11.
12.
13.
14.

17.

Console.WriteLine(i);
Console.WriteLine(s);
Console.WriteLine(ui);

18.

Console.ReadLine();

15.
16.

19.
20.

}
OALP-2004 All Rights Reserved

Conversiones Explcitas 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 lanzara una excepcin
System.InvalidCastException

Ej: una manzana es una fruta, pero una


fruta no necesariamente es una
manzana
OALP-2004 All Rights Reserved