Başvuru Türü Parametreleri Geçirme (C# Programlama Kılavuzu)Passing Reference-Type Parameters (C# Programming Guide)

Bir başvuru türünden bir değişken verilerini doğrudan içermez; verilerine bir başvuru içerir.A variable of a reference type does not contain its data directly; it contains a reference to its data. Bir başvuru türü parametresini değere göre geçtiğiniz zaman, bir sınıf üyesinin değeri gibi başvurulan nesneye ait verileri değiştirmek mümkündür.When you pass a reference-type parameter by value, it is possible to change the data belonging to the referenced object, such as the value of a class member. Ancak, başvurunun değerini değiştiremezsiniz; örneğin, belleği yeni bir nesne için ayırmak ve yöntemin dışında devam etmesini sağlamak için aynı başvuruyu kullanamazsınız.However, you cannot change the value of the reference itself; for example, you cannot use the same reference to allocate memory for a new object and have it persist outside the method. Bunu yapmak için, ref'i kullanarak parametreyi geçirin veya anahtar kelimeyi atın.To do that, pass the parameter using the ref or out keyword. Basitlik için aşağıdaki örnekler refkullanılır.For simplicity, the following examples use ref.

Referans Türlerini Değere Göre GeçirmePassing Reference Types by Value

Aşağıdaki örnek, bir referans türü parametre, arrdeğer, bir yönteme geçen Changegösterir.The following example demonstrates passing a reference-type parameter, arr, by value, to a method, Change. Parametre bir başvuru arrolduğundan, dizi öğelerinin değerlerini değiştirmek mümkündür.Because the parameter is a reference to arr, it is possible to change the values of the array elements. Ancak, parametreyi farklı bir bellek konumuna yeniden atama girişimi yalnızca yöntemin içinde arrçalışır ve özgün değişkeni etkilemez.However, the attempt to reassign the parameter to a different memory location only works inside the method and does not affect the original variable, 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
*/

Önceki örnekte, arrbir başvuru türü olan dizi, ref parametre olmadan yönteme geçirilir.In the preceding example, the array, arr, which is a reference type, is passed to the method without the ref parameter. Böyle bir durumda, başvurunun bir kopyası, arrhangi işaret , yönteme geçirilir.In such a case, a copy of the reference, which points to arr, is passed to the method. Çıktı, yöntemin bir dizi öğesinin içeriğini değiştirmesinin mümkün olduğunu gösterir, bu durumda 1 888.The output shows that it is possible for the method to change the contents of an array element, in this case from 1 to 888. Ancak, Change yöntem içinde yeni işleci kullanarak bellek yeni bir pArray bölümünü ayırmak değişken başvuru yeni bir dizi yapar.However, allocating a new portion of memory by using the new operator inside the Change method makes the variable pArray reference a new array. Böylece, bundan sonraki herhangi bir değişiklik arriçinde oluşturulan orijinal Maindizi, etkilemez.Thus, any changes after that will not affect the original array, arr, which is created inside Main. Aslında, bu örnekte biri içinde, Main diğeri yöntemin Change içinde olmak üzere iki dizi oluşturulur.In fact, two arrays are created in this example, one inside Main and one inside the Change method.

Referans Türlerini Başvuruya Göre GeçirmePassing Reference Types by Reference

Aşağıdaki örnek, anahtar kelimenin ref yöntem üstbilgisine ve aramaya eklenmesi dışında, önceki örnekle aynıdır.The following example is the same as the previous example, except that the ref keyword is added to the method header and call. Yöntemde gerçekleşen değişiklikler, arama programındaki özgün değişkeni etkiler.Any changes that take place in the method affect the original variable in the calling program.

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

Yöntem içinde gerçekleşen tüm değişiklikler' deki özgün Maindiziyi etkiler.All of the changes that take place inside the method affect the original array in Main. Aslında, özgün dizi new işleç kullanılarak yeniden tahsis edilir.In fact, the original array is reallocated using the new operator. Böylece, Change yöntemi aradıktan sonra, arr Change yöntemde oluşturulan beş öğeli dizi, noktalara herhangi bir başvuru.Thus, after calling the Change method, any reference to arr points to the five-element array, which is created in the Change method.

İki Dize DeğiştirmeSwapping Two Strings

Dizeleri değiştirme başvuru türü parametreleri başvuru ile geçen iyi bir örnektir.Swapping strings is a good example of passing reference-type parameters by reference. Örnekte, iki dizeleri str1 str2ve , Main başharfve anahtar SwapStrings kelime tarafından ref değiştirilen parametreler olarak yönteme geçirilir.In the example, two strings, str1 and str2, are initialized in Main and passed to the SwapStrings method as parameters modified by the ref keyword. İki dize yöntem içinde ve içinde Main de takas edilir.The two strings are swapped inside the method and inside Main as well.

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

Bu örnekte, arama programındaki değişkenleri etkilemek için parametrelerin referans la geçirilmesi gerekir.In this example, the parameters need to be passed by reference to affect the variables in the calling program. Anahtar kelimeyi ref hem yöntem üstbilgisinden hem de yöntem çağrısından kaldırırsanız, arama programında hiçbir değişiklik yapılmaz.If you remove the ref keyword from both the method header and the method call, no changes will take place in the calling program.

Dizeleri hakkında daha fazla bilgi için string'ebakın.For more information about strings, see string.

Ayrıca bkz.See also