Pasar parámetros de tipo de valor (Guía de programación de C#)
Una variable de tipo de valor contiene directamente los datos, a diferencia de una variable de tipo de referencia, que contiene una referencia a los datos.Pasar una variable de tipo de valor a un método por valor significa pasar una copia de la variable al método.Cualquier cambio en el parámetro que tenga lugar dentro del método no tiene ningún efecto en los datos originales almacenados en la variable de argumento.Si desea que el método denominado para cambiar el valor del parámetro, debe pasarlo por referencia, mediante la palabra clave de referencia o de out .Para simplificar, los siguientes ejemplos utilizan ref.
Pasar tipos de valor por valor
El siguiente ejemplo ilustra el paso de parámetros de tipo de valor por valor.La variable n se pasa por valor al método SquareIt.Cualquier cambio que se produzca dentro del método no afectará al valor original de la variable.
class PassingValByVal
{
static void SquareIt(int x)
// The parameter x is passed by value.
// Changes to x will not affect the original value of x.
{
x *= x;
System.Console.WriteLine("The value inside the method: {0}", x);
}
static void Main()
{
int n = 5;
System.Console.WriteLine("The value before calling the method: {0}", n);
SquareIt(n); // Passing the variable by value.
System.Console.WriteLine("The value after calling the method: {0}", n);
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
}
/* Output:
The value before calling the method: 5
The value inside the method: 25
The value after calling the method: 5
*/
n variable es un tipo de valor.Contiene los datos, el valor 5.Cuando se invoca SquareIt, el contenido de n se copia en el parámetro x, el cual se eleva al cuadrado dentro del método.En Main, sin embargo, el valor de n es igual después de llamar al método de SquareIt que antes.El cambio que tiene lugar dentro del método afecta sólo a la variable local x.
Pasar tipos de valor por referencia
El ejemplo siguiente es igual que el ejemplo anterior, excepto que el argumento se pasa como parámetro de ref .El valor del argumento subyacente, n, cambia a x cambia en el método.
class PassingValByRef
{
static void SquareIt(ref int x)
// The parameter x is passed by reference.
// Changes to x will affect the original value of x.
{
x *= x;
System.Console.WriteLine("The value inside the method: {0}", x);
}
static void Main()
{
int n = 5;
System.Console.WriteLine("The value before calling the method: {0}", n);
SquareIt(ref n); // Passing the variable by reference.
System.Console.WriteLine("The value after calling the method: {0}", n);
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
}
/* Output:
The value before calling the method: 5
The value inside the method: 25
The value after calling the method: 25
*/
En este ejemplo, no se pasa el valor de n, sino una referencia a n.El parámetro x no es de tipo int; es una referencia a un valor de tipo int, en este caso, una referencia a n.Por consiguiente, cuando x se eleva dentro del método, lo que se eleva realmente es a lo que se conoce x , n.
Intercambiar tipos de valor
Un ejemplo común de cambiar los valores de argumentos es un método de intercambio, donde se pasan dos variables al método, y el método intercambia su contenido.Debe pasar los argumentos del método de intercambio por referencia.Si no, se intercambia copias locales de los parámetros en el método, y no se produce ningún cambio en el método de llamada.El ejemplo siguiente se cambia valores enteros.
static void SwapByRef(ref int x, ref int y)
{
int temp = x;
x = y;
y = temp;
}
Cuando se llama al método de SwapByRef , utilice la palabra clave de ref en la llamada, como se muestra en el ejemplo siguiente.
static void Main()
{
int i = 2, j = 3;
System.Console.WriteLine("i = {0} j = {1}" , i, j);
SwapByRef (ref i, ref j);
System.Console.WriteLine("i = {0} j = {1}" , i, j);
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
/* Output:
i = 2 j = 3
i = 3 j = 2
*/
Vea también
Referencia
Pasar parámetros (Guía de programación de C#)
Pasar parámetros Reference-Type (Guía de programación de C#)