2017-03-03 3 views
-3

Ich habe folgendes Beispiel für Array-ModifikationArrays & Methoden C#

static void main() 
{ 
    int[] arr1 = { 1, 4, 5 }; 
    Console.WriteLine("{0}", arr1[0]);  
    ModifyArray(arr1); 
    Console.WriteLine("{0}", arr1[0]); 
} 

static void ModifyArray(int[] arr1) 
{ 
    arr1[0] = 20; 
    arr1 = new int[5] { -3, -1, -2, -3, -4 }; 
    Console.WriteLine("{0}", arr1[0]); 
} 

Warum druckt

1, -3,20

statt

1, -3, -3

?

+0

Fragen Debuggen Hilfe suchen muss („warum nicht dieser Code funktioniert?“) Fügen Sie das gewünschte Verhalten, ein bestimmtes Problem oder einen Fehler und den kürzesten Code ein, der für die Reproduktion in der Frage erforderlich ist. Fragen ohne eine klare Problemstellung sind für andere Leser nicht nützlich. Siehe: Erstellen eines minimalen, vollständigen und überprüfbaren Beispiels. –

+0

Mögliches Duplikat von [Passing Arrays nach Wert und nach Referenz] (http://stackoverflow.com/questions/10325323/passing-arrays-by-value-and-by-reference) – ASh

+0

In Fairness, wenn Sie den OPs-Code ausführen es wird die Ergebnisse geben, die er angegeben hat. Das Missverständnis des OP besteht darin, dass Referenztypen wie Arrays übergeben werden, indem eine Kopie der Referenz * mit dem Wert * übergeben wird. –

Antwort

3

Dieses Programm verhält sich korrekt.

Eine Kopie des Verweises auf arr1 wird durch Wert ModifyArray() weitergegeben, so dass, wenn Sie einen neuen Wert zu arr1 innerhalb ModifyArray() zuweisen es nicht den Original-Array ändern.

Wenn Sie das ursprüngliche Array-Referenz ändern möchten, müssen Sie es durch ref übergeben, indem Sie den ref Schlüsselwort wie folgt:

public static void Main() 
{ 
    int[] arr1 = { 1, 4, 5 }; 
    Console.WriteLine("{0}", arr1[0]); 
    ModifyArray(ref arr1); 
    Console.WriteLine("{0}", arr1[0]); 
} 

static void ModifyArray(ref int[] arr1) 
{ 
    arr1[0] = 20; 
    arr1 = new int[5] { -3, -1, -2, -3, -4 }; 
    Console.WriteLine("{0}", arr1[0]); 
} 
+0

Obwohl jetzt die erste Zeile in der Methode nutzlos ist, weil Sie danach ein neues Array zuweisen. –

+0

@TimSchmelter Nun aus der Sicht der Methode selbst könnte es etwas tun, da Sie möglicherweise mehr als eine Referenz auf das Array haben, und nur die an diese Methode übergeben wird, wird geändert. Zum Beispiel, wenn Sie 'ModifyArray()' kurz zuvor aufgerufen haben, haben Sie 'var arr2 = arr1; 'und dann nach dem Aufruf' Console.WriteLine (arr2 [0]); '- was" 20 "ausgibt. –

+0

Wahr, guter Punkt –