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;
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:
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!
Guille, gracias por la observación, es cierto que me equivoque con el ejemplo, pero ya fue CORREGIDO.
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.
Publicar un comentario