Variables por valor o por referencia:
- Por valor: cuando la variable contiene realmente los datos. Un tipo de valor almacena su contenido en la memoria asignada en la pila. Cuando la variable x queda fuera de ámbito, porque en el método en que se definió ha finalizado la ejecución, el valor se descarta de la pila. Utilizar la pila es eficaz, pero el período limitado de duración de los tipos de valores los hace menos adecuados para compartir los datos entre las diferentes clases. Cuando los datos se pasan a los métodos como parámetros de tipo de valor, se crea una copia de cada parámetro en la pila. Evidentemente, si el parámetro en cuestión es un tipo de datos grande, por ejemplo, una estructura definida por el usuario con muchos elementos, o el método se ejecuta muchas veces, puede afectar el rendimiento.
- Por referencia: la variable contiene la dirección de la memoria donde se encuentran los datos. Se asigna en un área diferente de memoria llamada “montón”. En el ejemplo siguiente, el espacio requerido para los diez enteros que constituyen la matriz se asigna en el montón. Hay una sobrecarga mayor al declarar los tipos de referencia, pero éstos tienen la ventaja de ser accesibles desde otras clases.
Veamos un ejemplo de Variable Valor y otro variable referencia:
int x = 42; //por valor. int[] numeros= new int[10]; //por referencia
Paso de parámetros por valor y por referencia a una función:
int SumaDiez(int number) // parámetro pasado por valor { return number + 10; } void SumaDiez(ref int number) // parámetro pasado por referencia { number += 10; }
La palabra clave out es similar a la palabra clave ref, pero indica al compilador que el método debe asignar un valor al parámetro o se producirá un error de compilación.
void PonerUnDiez(out int number) { // Si esta línea no estuviera presente el código no compilaría number = 10; }