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
.
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: Ссылка
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% fügen Sie der Funktion ref
hinzu, um sie mit ref.
Dann nenne es wie:
%Vor% 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
Tags und Links c#