miércoles, 9 de julio de 2008

Tipos de Datos

Cada variable debe tener un tipo de datos. El tipo de datos de una variable determina los valores que la variable puede contener y las operaciones que pueden llevarse a cabo en ellas.

Tipos de Datos Primitivos

Números Enteros

int numeroEntero; //Entero de 32 Bits
short numeroCorto; //Entero de 16 Bits

long numeroLargo; //Entero de 64 Bits


Números Enteros sin signo

uint numeroEnteroSinSigno; //Entero de 32 Bits sin signo
ushort numeroCortoSinSigno; //Entero de 16 Bits sin signo
ulong numeroLargoSinSigno; //Entero de 64 Bits sin signo


Fraccionarios

float numeroFraccionario; //Números Reales de 32 bits
double numeroFraccionario; //Número Reales de 64 bits


Caracteres

byte nByte; //Caracteres Numéricos sin signo
sbyte nByteConSigno; //Caracteres Numéricos con signo
char caracter; //Caracter Simple
string cadenaTexto; //Cadena de Texto


Booleanos

bool tipoBooleano; //Los valores que permite son True o False.

Tipos por Valor

Los tipos por valor son tipos de datos cuyo valor se almacena en la pila, y cualquier cambio que hagamos lo haremos directamente sobre dicho valor, de igual forma cuando copiamos valores de un tipo por valor a otro, estaremos haciendo copias independientes.

Ejemplo de Tipo por Valor:

Defino una variable del tipo entero:

int numeroEntero;

Le asigno un valor:

numeroEntero = 10;

Es un tipo por valor por que le estoy asignado un valor a la variable numeroEntero, en este caso 10.

Ahora defino una variable del tipo entero:

int numeroEnteroB;

Y si le asigno el contenido de numeroEntero, a esta nueva variable:

numeroEnteroB = numeroEntero;

Entonces el contenido de la nueva variable tambien sera 10

Tipo por Referencia

Se almacenan en el heap o memoria lejana, lo único que almacenan es una referencia al valor asignado. Si hacemos copias de tipos por referencia relamente lo que copiamos es la referencia propiamente dicha, pero no el contenido.

Ejemplo de tipo por referencia

Mas adelante veremos como crear nuestros propios tipos de datos por referencia, por el momento utilizaremos un tipo por referencia existente:

Object tipoRef;
tipoRef = numeroEntero;

Por lo tanto a la variable tipoRef no le estoy asignando el contenido, sino la referencia de memoria, es decir la dirección de memoria donde puedo encontrar el contenido.

Por lo tanto los Tipos de datos por Valor son todos los Tipo de datos Primitivos, y por Referencia son los restantes.

3 comentarios:

Guillermo Bellmann dijo...

Hola César.
El ejemplo de tipo por valor está bien, pero el del tipo por referencia está equivocado. Esto seguramente se debe a que recién están empezando en el mundo .NET.
Lo que en realidad hiciste en tu segundo ejemplo, es crear otro tipo de dato por valor y copiaste su contenido de una variable a otra. AMBAS contienen el valor 10, y son independientes (si cambias el valor de numeroEntero no se modifica el de numeroEnteroB).
Un tipo por valor almacena directamente la variable (en la pila o stack), mientras que un tipo de dato por referencia almacena una referencia a dicha información (la que es almacenada en el heap).
En .NET los tipos por valor son: (Muestro la clase y entre paréntesis su alias para C# si lo tiene)
- System.SByte (sbyte)
- System.Byte (byte)
- System.Int16 (short)
- System.Int32 (int)
- System.UInt32 (uint)
- System.Int64 (long)
- System.Single (float)
- System.Double (double)
- System.Decimal (decimal)
- System.Char (char)
- System.Boolean (bool)
- System.IntPtr
- System.DateTime (date)
- Todos las estructuras (struct)
- Los enumerados (enum)
Todo el resto son valores por referencia.
Espero que les sirva la info.
Saludos!

César Castillo dijo...

Guille, gracias por la observación, es cierto que me equivoque con el ejemplo, pero ya fue CORREGIDO.

Julio dijo...

Aguante la teoría de punteros

resulta que ahora le dicen referencias ...

Mas allá de la broma, esta es una de las características de C# y de Java que lo hacen más amigable respecto de C++, quién mantiene la denominación de puntero (pointers) para aquellos tipos de datos que contiene una dirección de memoria que es donde realmente está la información.

Indudablemente la potencia de los actuales compiladores, hace mucho mas facil la vida de los programadores, sin embargo hay que tener muy bien en claro que es lo que se está haciendo. Probablemente con tipos básicos como int, double, etc. no haya problema; pero cuando estamos trabjando con instancias de alguna clase hay que pensar que está haciendo el codigo.

En general, al tratarse de referencias (punteros) la dirección de memoria donde esta el objeto va pasando de una variable a otra, pero justamente es ahí donde podemos cometer el error. Se debe cuidar que haya una sola referencia al objeto, caso contrario podemos liberarlo con la otra y entonces se nos pudrió la aplicaciones y será muy dificil hallar el problema.