Przekazywanie parametrów typu odwołanie (Przewodnik programowania w języku C#)

Zmiennej Typ odwołania nie zawiera danych jej bezpośrednio; zawiera odniesienie do jego danych.Parametr typu odwołania jest przekazywany za pomocą wartości, jest możliwe zmienianie danych wskazywanej przez odwołanie, takie jak wartość elementu członkowskiego klasy.Jednakże nie można zmienić wartości odniesienia oznacza to nie można użyć samego odniesienia, aby przydzielić pamięci dla nowej klasy i utrzymują się poza blokiem.W tym celu należy przekazywać za pomocą parametru ref lub z słowa kluczowego.Dla uproszczenia, w następujących przykładach użyto ref.

Typy odwołań przechodzącej przez wartość

Poniższy przykład prezentuje przekazanie parametru typu odwołania, arr, według wartości do metody, Change.Ponieważ parametr jest odniesienie do arr, istnieje możliwość zmiany wartości elementów tablicy.Jednak próba ponownego przypisywania parametru do różnych lokalizacji w pamięci tylko działa wewnątrz metody i nie wpływa na pierwotnej zmiennej arr.

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
*/

W poprzednim przykładzie array, arr, który jest typem odwołania jest przekazywana do metody bez ref parametru.W takim przypadku kopię odniesienia, która wskazuje na arr, jest przekazywany do metody.Dane wyjściowe pokazuje, że jest możliwe dla metody, w tym przypadku zmienić zawartość elementu tablicy, z 1 do 888.Jednakże przydzielanie nowej części pamięci przy użyciu Nowy operator wewnątrz Change metoda sprawia, że zmienna pArray odwołać nowej tablicy.W ten sposób, wszelkie zmiany, po którego nie wpłynie na tablicy oryginalnej arr, który jest tworzony wewnątrz Main.W rzeczywistości dwie tablice są tworzone w tym przykładzie jeden wewnątrz Main i wewnątrz jednej Change metody.

Typy odwołań przechodzącej przez odwołanie

Poniższy przykład jest taki sam, jak w poprzednim przykładzie, z wyjątkiem ref słowa kluczowego zostanie dodany do nagłówka metody i wywołanie.Wszelkie zmiany, które odbywają się w metodzie wpływają na oryginalny zmiennej do programu wywołującego.

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
*/

Wszystkie zmiany, które wypadają wewnątrz metody wpływają na tablicy oryginalnej w Main.W rzeczywistości tablicy oryginalnej alokowaniu za pomocą new operatora.Tak więc po wywołaniu Change metodę, wszelkie odniesienia do arr punkty do tablicy pięciu element, który jest tworzony w Change metody.

Zamiana dwóch ciągów

Zamiana ciągi jest dobrym przykładem przekazywania parametrów typ odwołania, przez odniesienie.W tym przykładzie dwa ciągi, str1 i str2, są inicjowane w Main i przekazany do SwapStrings metody jako parametry zmodyfikowane przez ref słowa kluczowego.Dwa ciągi są zamienione wewnątrz metody i wewnątrz Main jak również.

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
*/

W tym przykładzie parametry muszą zostać przekazane poprzez odniesienie do wpływają na zmienne do programu wywołującego.Jeśli usuniesz ref słowa kluczowego z nagłówka metody i wywołanie metody, żadne zmiany nie będą miały miejsce w program wywołujący.

Aby uzyskać więcej informacji na temat ciągów, zobacz string.

Zobacz też

Informacje

Przekazywanie parametrów (Przewodnik programowania w języku C#)

Przekazywanie tablic za pomocą ref i out (Przewodnik programowania w języku C#)

ref (odwołanie w C#)

Typy odwołań (odwołanie w C#)

Koncepcje

Przewodnik programowania w języku C#