Nada

jueves, 1 de mayo de 2008

Tipos por Valor vs. Tipos por Referencia

En Visual C# existen dos tipos de variables, y para el desarrollador de aplicaciones es muy importante saberlo, y saber cómo y cuando está usando un tipo u otro, porque de ello depende en buena medida la calidad de su desarrollo.

Las variables pueden ser por Valor o por Referencia.

Un Tipo por Valor es un tipo que contiene los propios datos almacenados. Podemos imaginarnos los Tipos por valor como una cajita donde metemos cosas. Cuando necesitamos usar la cosa, vemos el contenido de la cajita, y lo manipulamos directamente. Los tipos numéricos de Visual Studio: int, long, double, float son ejemplos de Tipos por Valor.

Cuando asignamos a una variable de un tipo por valor el contenido de otra variable, hacemos una copia de la "cosa" contenida en la cajita, y desde ese momento, ambas copias son completamente independientes. Pongamos un ejemplo:


static void Main(string[] args)
{
int i;
int j;

i = 1;
j = i;
i++;
j--;
Console.WriteLine(String.Format("i={0} j={1}", i, j));

// i=2 j=0, porque al asignar j=i, lo que hacemos es
// una copia de su contenido.

Console.ReadKey();
}


Los Tipos por Referencia, por el contrario, son tipos que contienen una referencia a los datos, en vez de los datos en si. Podemos imaginarnos los tipos por referencia como una cajita donde, en vez de cosas, guardamos un papel que dice donde está la cosa que queremos usar.

Cuando asignamos una variable de un tipo por referencia a otra, copiamos el papel que dice dónde está guardada la cosa. Algunos ejemplos de tipos por referencia son object, List, etc.


static void Main(string[] args)
{
List L;
List M;

L = new List();
L.Add(7);

M = L;
M.Add(1);

Console.WriteLine(String.Format(
"Elementos en L={0} Elementos en M={1}", L.Count, M.Count));

// Elementos en L=2 Elementos en M=2, porque L y M apuntan al
// mismo objeto.

Console.ReadKey();
}




El caso del tipo string es particular, ya que es un tipo por referencia, pero se comporta como un tipo por valor. Esto se debe a que Visual Studio .Net define los strings como inmutables, es decir: una vez creado el objeto, no se puede cambiar de ninguna manera.

Notas para quienes programan Pivotal CRM


El objeto Recordsets que se manipula en varios de los Puntos de Transición del sistema es, naturalmente, un tipo por referencia; y su contenido (los recordsets que representan los datos del Primario y cada uno de los Secundarios del Form) también lo son.

Como consecuencia de eso, podemos perfectamente manipular cualquiera de esos recordsets mediante variables de tipo Recordset, y no es necesario volver a asignar estas variables al objeto Recordsets:



Recordset rst;

rst = (Recordset) Recordsets[0];
rst.Fields[strfNOMBRE_CAMPO].Value = "Valor";

// NO es necesario hacer lo siguiente:
// Recordsets[0] = rst;


2 comentarios:

Fabián García dijo...

Gracias por tu nota :)

Karyna Meneses dijo...

excelente :D más claro ni el agua :P