Share via


Passando parâmetros de tipo de valor (Guia de Programação em 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 em C#)

Passando parâmetros de tipo de referência (Guia de Programação em C#)

Conceitos

Guia de Programação em C#