Passando parâmetros de tipo de valor (guia de programação do C#)
A tipo de valor variável contém seus dados diretamente, em oposição a uma tipo de referência variável, que contém uma referência a seus dados.Passar uma variável do tipo de valor para um método por valor significa passar uma cópia da variável para o método.Quaisquer alterações que ocorrem dentro do método para o parâmetro não tem nenhum efeito nos dados originais armazenados na variável argumento.Se desejar que o método chamado para alterar o valor do parâmetro, deve passar por referência, usando o ref ou check-out palavra-chave.Para simplificar, os exemplos seguintes usam ref.
Tipos de valor de passagem por valor
O exemplo a seguir demonstra o tipo de valor de passagem de parâmetros por valor.A variável n é passado por valor para o método SquareIt.Quaisquer alterações que ocorrem dentro do método não têm nenhum efeito no valor da variável original.
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
*/
A variável n é um tipo de valor.Ele contém os seus dados, o valor 5.Quando SquareIt é invocado, o conteúdo de n são copiados para o parâmetro x, que é elevado ao quadrado dentro do método.Na Main, no entanto, o valor de n é o mesmo após a chamada a SquareIt método como ele era antes.A alteração que ocorre dentro do método afeta somente a variável local x.
Tipos de valor de passagem por referência
O exemplo a seguir é o mesmo do exemplo anterior, exceto que o argumento é passado como um ref parâmetro.O valor do argumento subjacente, n, será alterada quando x é alterado no 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
*/
Neste exemplo, não é o valor de n que é passado; em vez disso, uma referência a n é passado.O parâmetro x não é um int; ele é uma referência a um int, neste caso, uma referência a n.Portanto, quando x é elevado ao quadrado dentro do método, o que realmente é elevado ao quadrado é o que x refere-se a, n.
Tipos de valor de troca
Um exemplo comum de alteração dos valores dos argumentos é um método de troca, onde você passar duas variáveis para o método e o método de troca de seu conteúdo.Você deve passar argumentos para o método de troca por referência.Caso contrário, você troca cópias locais dos parâmetros dentro do método e nenhuma alteração ocorre no método de chamada.O exemplo a seguir troca os valores inteiros.
static void SwapByRef(ref int x, ref int y)
{
int temp = x;
x = y;
y = temp;
}
Quando você chama o SwapByRef método, use o ref palavra-chave na chamada, conforme mostrado no exemplo a seguir.
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
*/
Consulte também
Referência
Passando parâmetros (guia de programação do C#)
Passando parâmetros de tipo de referência (guia de programação do C#)