Array-Parameter in C # übergeben: Warum ist es implizit durch Referenz?

7

Nehmen Sie den folgenden Code ohne% ref Schlüsselwort an, der die übergebene Variable offensichtlich nicht ersetzt, da sie als Wert übergeben wurde.

%Vor%

Damit diese Funktion wie erwartet funktioniert, fügt man wie gewohnt das Schlüsselwort ref hinzu:

%Vor%

Nun bin ich perplex, warum Array-Member, wenn sie in Funktionen übergeben werden, implizit als Referenz übergeben werden. Sind Arrays keine Werttypen?

%Vor%     
Lazlo 30.08.2010, 21:33
quelle

6 Antworten

16

Nein, Arrays sind Klassen, dh sie sind Referenztypen.

    
bright 30.08.2010, 21:35
quelle
2

Arrays werden nicht als Referenz übergeben. Verweise auf Arrays werden als Wert übergeben. Wenn es erforderlich ist, das Feld WHAT zu ändern, auf das eine übergebene Array-Variable verweist (z. B. um die Größe des Arrays zu ändern), muss die Variable als Verweis übergeben werden.

    
supercat 30.08.2010 21:41
quelle
2

Eine gute Möglichkeit, sich daran zu erinnern ist:

  • "ref" erstellt einen Alias ​​ für eine Variable
  • Ein Array ist eine Sammlung von Variablen ; Jedes Element ist eine Variable.

Wenn Sie ein Array normal übergeben, übergeben Sie eine Sammlung von Variablen . Die Variablen in der Sammlung ändern sich nicht.

Wenn Sie ein Array mit "ref" übergeben, geben Sie einen neuen Namen für die Variable mit dem Array ein.

Wenn Sie ein Array-Element normal übergeben, übergeben Sie den Wert in der Variablen .

Wenn Sie ein Array-Element - eine Variable - mit "ref" übergeben, geben Sie einen neuen Namen für diese Variable ein .

Macht Sinn?

    
Eric Lippert 30.08.2010 21:53
quelle
1

Können Sie sich vorstellen, ein 2-Millionen-Element-Array nach Wert zu übergeben? Stellen Sie sich nun vor, dass der Elementtyp decimal ist. Sie müssen um 240MB 30,5175781MB Daten kopieren.

    
ChaosPandion 30.08.2010 21:50
quelle
0

Wie von der MSDN-Referenz angegeben, sind Arrays Objekte ( System.Array ist der abstrakte Basistyp aller Arrays und Objekte werden als Referenz übergeben.

    
thomasvdb 30.08.2010 21:37
quelle
0

Abgesehen von grundlegenden Datentypen können Sie nichts anderes als Übergabe übergeben. Array ist eine Sammlung von grundlegenden Datentypen, die auch die Übergabe nach Wert bei der Sammlung ermöglichen, die mehrere Kopien der Sammlung erstellt, was die Leistung beeinträchtigen würde.

    
Kiran Bheemarti 30.08.2010 21:44
quelle