Share via


Passando parâmetros de tipo de referência (guia de programação translation from VPE for Csharp)

Uma variável de um tipo de referência não contém os dados diretamente; ela contém uma referência a seus dados.Quando você passar um parâmetro de tipo de referência por valor, é possível alterar sistema autônomo dados apontados por referência, sistema autônomo o valor de um membro de classe.No entanto, não é possível alterar o valor da própria referência; ou seja, não é possível usar a mesma referência para alocar memória para uma nova classe e fazer com que ele persista fora do bloco.Para isso, passe o parâmetro usando o ref or check-out palavra-chave.Para simplificar, os exemplos a seguir usam ref.

Exemplo

O exemplo a seguir demonstra como passar um parâmetro de tipo de referência, arr, por valor, a um método Change. Como o parâmetro é uma referência a arr, é possível alterar os valores de elementos de matriz. No entanto, a tentativa de reatribuir o parâmetro para um local diferente de memória só funciona dentro do método e não afeta a variável, originalarr.

class PassingRefByVal 
{
    static void Change(int[] pArray)
    {
        pArray[0] = 888;  // This change affects the original element.
        pArray = new int[5] {-3, -1, -2, -3, -4};   // This change is local.
        System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]);
    }

    static void Main() 
    {
        int[] arr = {1, 4, 5};
        System.Console.WriteLine("Inside Main, before calling the method, the first element is: {0}", arr [0]);

        Change(arr);
        System.Console.WriteLine("Inside Main, after calling the method, the first element is: {0}", arr [0]);
    }
}
/* Output:
    Inside Main, before calling the method, the first element is: 1
    Inside the method, the first element is: -3
    Inside Main, after calling the method, the first element is: 888
*/

No exemplo anterior, o array, arr, que é um tipo de referência, é passado para o método sem o ref parâmetro. Nesse caso, uma cópia de referência, que aponta para arr, é passado para o método. A saída mostra que é possível que o método alterar o Sumário de um elemento de matriz, no caso de 1 para 888. No entanto, alocar uma nova parte da memória usando o novo operador dentro de Change método faz com que a variável pArray fazer referência a uma nova matriz. Portanto, quaisquer alterações depois que isso não afetará a matriz original, arr, que é criado dentro de Main. Em fato, duas matrizes são criadas neste exemplo, um interno Main e dentro de um a Change método.

Este exemplo é o mesmo do exemplo anterior, exceto por usar o ref palavra-chave no cabeçalho de método e telefonar. Quaisquer alterações que ocorrem no método afetarão as variáveis originais no programa de chamada.

class PassingRefByRef 
{
    static void Change(ref int[] pArray)
    {
        // Both of the following changes will affect the original variables:
        pArray[0] = 888;
        pArray = new int[5] {-3, -1, -2, -3, -4};
        System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]);
    }

    static void Main() 
    {
        int[] arr = {1, 4, 5};
        System.Console.WriteLine("Inside Main, before calling the method, the first element is: {0}", arr[0]);

        Change(ref arr);
        System.Console.WriteLine("Inside Main, after calling the method, the first element is: {0}", arr[0]);
    }
}
/* Output:
    Inside Main, before calling the method, the first element is: 1
    Inside the method, the first element is: -3
    Inside Main, after calling the method, the first element is: -3
*/

Todas as alterações que ocorrem dentro do método afetam a matriz original em Main. Na verdade, a matriz original é realocada usando o new operador. Assim, após chamar o Change método, qualquer referência a arr aponta para a matriz de cinco elementos, que é criada no Change método.

Trocar cadeias de caracteres é um mercadoria exemplo de passar parâmetros de tipo de referência por referência.No exemplo, duas cadeias de caracteres, str1 e str2, são inicializados na Main e passado para o SwapStrings método sistema autônomo parâmetros modificado pela ref palavra-chave. sistema autônomo duas seqüências de caracteres são trocadas dentro do método e interna Main também.

 class SwappingStrings
 {
     static void SwapStrings(ref string s1, ref string s2)
     // The string parameter is passed by reference.
     // Any changes on parameters will affect the original variables.
     {
         string temp = s1;
         s1 = s2;
         s2 = temp;
         System.Console.WriteLine("Inside the method: {0} {1}", s1, s2);
     }

     static void Main()
     {
         string str1 = "John";
         string str2 = "Smith";
         System.Console.WriteLine("Inside Main, before swapping: {0} {1}", str1, str2);

         SwapStrings(ref str1, ref str2);   // Passing strings by reference
         System.Console.WriteLine("Inside Main, after swapping: {0} {1}", str1, str2);
     }
 }
 /* Output:
     Inside Main, before swapping: John Smith
     Inside the method: Smith John
     Inside Main, after swapping: Smith John
*/

Neste exemplo, os parâmetros precisam ser passados por referência para afetar as variáveis no programa de chamada.Se você remover o ref palavra-chave do cabeçalho do método e a telefonar de método, nenhuma alteração ocorrerá no programa de telefonar.

Para obter mais informações sobre seqüências de caracteres, consulte seqüência de caracteres.

Consulte também

Conceitos

Guia de Programação C#

Referência

Passando parâmetros (guia de programação translation from VPE for Csharp)

Passando usando matrizes ref e out (translation from VPE for Csharp Programming guia)

REF (translation from VPE for Csharp Reference)

Tipos de referência (referência C#)