2017-07-28 2 views
0

Ich habe einen # Code C wie folgt:C# Arrayparameter Referenz

int[] A = new int[] {1, 2, 3}; 
fun(A); 
// A at this point still says 1, 2, 3. 

void fun(int[] A) 
{ 
    int[] B = new int[] {4, 5, 6}; 
    A = B; 
} 

dachte ich alle Arrays durch Bezugnahme in C# geben werden. Sollte nicht A nach dem Anruf fun() 4, 5, 6 reflektieren?

+0

Sie müssen den ursprünglichen Verweis auf A ändern, Sie tun es nie. Siehe [docs] (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/passing-reference-type-parameters#passing-reference-types-by- Wert) – maccettura

+4

Die Elemente des Arrays werden als Referenz übergeben, nicht das Array selbst. Siehe: https://stackoverflow.com/questions/967402/are-arrays-or-lists-passed-by-default-by-reference-in-c –

+0

Wenn Sie Beispiele machen, sollten Sie nicht den gleichen Namen an mehreren Orten verwenden, Es ist schwierig, über Ihr Beispiel zu sprechen. Der Name des Parameters und der Name der an die Funktion übergebenen Variablen sollten zwei verschiedene Namen sein, um das Beispiel einfacher zu machen. –

Antwort

1

Das Array von ein Referenz übergeben wird, können Sie dies sehen durch A[0] = 7; tun eine andere Methode von innen.

Diese Referenz (gehalten von der äußeren Variablen A) wird jedoch als Wert an die Funktion übergeben. Die Referenz wird kopiert und eine neue Variable wird erstellt und an die Funktion übergeben. Die Variable außerhalb der Funktion wird nicht von der Neuzuordnung der Parametervariablen A innerhalb der Funktion beeinflusst.

Um die ursprüngliche Variable zu aktualisieren, müssen Sie das Schlüsselwort ref verwenden, damit der Parameter innerhalb der Funktion das gleiche Objekt darstellt wie außerhalb der Funktion.

int[] A = new int[] {1, 2, 3}; 
fun2(A); 
// A at this point says 7, 2, 3. 
fun(ref A); 
// A at this point says 4, 5, 6. 

void fun2(int[] a) 
{ 
    a[0] = 7; 
} 

void fun(ref int[] a) 
{ 
    int[] B = new int[] {4, 5, 6}; 
    a = B; 
} 
+0

'Das Array wird als Referenz übergeben. Nein, es wird nach Wert übergeben, wie aus dem OP-Code ersichtlich ist. Wenn diese Aussage wahr wäre, dann hätte der OP-Code getan, was er erwartet hatte, und nicht, was er tatsächlich getan hatte. – Servy

+0

@Servy hat etwas umformuliert –

+0

Jetzt macht der Satz einfach keinen Sinn. Willst du sagen, dass das übergebene Array * eine Referenz ist, und nicht * eine Referenz? – Servy

1

dachte ich alle Arrays durch Bezugnahme in C#

tatsächlich weitergegeben werden (die Referenz des ursprünglichen Arrays Objekt Wert übergeben wird), die das übliche Verhalten bei Referenztypen in C# ist .

Ihr Verständnis ist teilweise korrekt, die Referenz wird übergeben, wird aber als Wert übergeben, was bedeutet, dass eine neue Referenz erstellt wird, die auf das ursprüngliche Array-Objekt A verweist.

Die fun(int[] A) hat seine eigene Kopie der Referenz ist, die auf das Array-Objekt zeigen die 1,2,3 und im fun enthält erstellen Sie ein neues Array-Objekt B und Sie zuweisen nur die Referenz des neuen zu Ihre lokale Methodenreferenzvariable, die natürlich keine Auswirkungen auf das ursprüngliche Objekt A hat, das als Eingabe an die fun übergeben wurde.

Sie müssten es als Referenz übergeben, wenn Sie die an A in fun vorgenommenen Änderungen widerspiegeln möchten, die zum ursprünglichen Array-Objekt zurückreflektiert werden sollen.

Sie können ohne den Weg durch Verweis die Array-Elemente aktualisieren, die gut in Scott Chamberlain's answer erklärt

Hoffe, es hilft!

+0

Sie sagen also, dass Arrays durch Verweis übergeben werden, und dann * später im selben Satz * sagen, dass sie nach Wert übergeben werden. Nein, Arrays * werden nicht als Referenz übergeben. Sagen Sie also nicht, dass sie das sind. – Servy

+0

die Referenz des ursprünglichen Array-Objekts wird durch den Wert –

+0

@ Ja übergeben, das ist richtig, anders als die fett geschriebene Aussage in Ihrer Antwort sagen, dass Arrays als Referenz übergeben werden, die falsch ist. – Servy