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
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)