Referenztyp in C # übergeben [duplizieren]

8
%Vor%

Die Ausgabe ist "Test", warum ist es nicht null?

Wenn s1 durch Referenz an Func () übergeben wird, warum ändert myString.Append("test") es, aber myString = null nicht?

Vielen Dank im Voraus.

    
thomas 13.09.2013, 13:27
quelle

5 Antworten

11
  

Wenn s1 durch Verweis auf Func () übergeben wird, dann warum   myString.Append ("test") ändert es

Es wird nicht von Referenzen übergeben, stattdessen wird der Adresswert an die Funktion übergeben.

Angenommen, S1 verweist auf eine Speicherstelle 0x48, Diese wird an Func übergeben, wobei Func parameter myString auf diesen Ort zeigt. Später, wenn Sie Append einen Text zu diesem Ort hinzufügen, wird er hinzugefügt. Aber später, wenn Sie null auf myString zuweisen, beginnt es auf nichts zu zeigen, aber der ursprüngliche Speicherort bleibt unverändert.

Sie sollten sehen: Parameter übergeben in C # von Jon Skeet

Betrachten Sie die folgenden Diagramme. In Schritt 1 erstellen Sie ein neues Objekt vom Typ StringBuilder und lassen S1 auf dieses Objekt verweisen.

In Schritt 2 zeigt% ce_de% nach dem Weitergeben von S1 an Func auch auf dasselbe Objekt im Speicher.

Später, wenn Sie myString , text bis Append , aktualisiert es das ursprüngliche Objekt, da myString auf den Speicherort des Objekts zeigt.

Wenn Sie in Schritt 3 null dem myString zuweisen, verliert es die Adresse für myString object, aber das ändert nichts an dem Objekt oder dem Zeiger StringBuilder .

    
Habib 13.09.2013, 13:31
quelle
11

Sie übergeben den Verweis auf das Objekt nach Wert.

i.e. Die Adresse des Objekts wird als Wert übergeben, die Adresse des Objekts und des Objekts ist jedoch identisch. Wenn Sie Ihre Methode aufrufen, kopiert die VM die Referenz. Sie ändern nur eine Kopie.

Bei myString.Append verwenden Sie den kopierten Verweis, um an das Objekt (immer noch nur ein Objekt) zu gelangen, das dann geändert / aufgerufen wird.

Was Sie denken, dass Sie tun, ist dies:

%Vor%

Eine längere Erklärung: Ссылка

    
Lasse Espeholt 13.09.2013 13:29
quelle
2

In C # wird der Zeiger (Verweis) auf einen komplexen Typ standardmäßig als Wert übergeben. Sie müssen angeben, dass es als Referenz übergeben wird:

%Vor%     
Karl Anderson 13.09.2013 13:30
quelle
0

fügen Sie der Funktion ref hinzu, um sie mit ref.

zu übergeben %Vor%

Dann nenne es wie:

%Vor%     
AssaultingCuccos 13.09.2013 13:30
quelle
0

Weil Sie einen Verweis auf Ihren StringBuilder s1 an Func übergeben. Innerhalb von Func wird der Verweis auf dieselbe StringBuilder-Instanz "myString" genannt. Sie sagen, es zuerst etwas ( " myString.Append("Test") ) zu tun, dann die Referenz INSIDE Func auf null gesetzt Das Ergebnis Anfügen ist sichtbar Main ();.. Der Verweis auf null hat keinen Einfluss auf s1 in Haupt gesetzt werden

    
svenv 13.09.2013 13:33
quelle

Tags und Links