Ich werde mich an einer Erklärung versuchen:
Ich denke, wir verstehen, wie die Werttypen richtig funktionieren? Werttypen sind (int, long, struct usw.). Wenn Sie sie ohne einen ref-Befehl an eine Funktion senden, werden die Daten kopiert . Alles, was Sie mit diesen Daten in der Funktion tun, wirkt sich nur auf die Kopie aus, nicht auf das Original. Der Befehl ref sendet die IST-Daten und alle Änderungen wirken sich auf die Daten außerhalb der Funktion aus.
Ok, weiter zum verwirrenden Teil, Referenztypen:
Erstellen wir einen Referenztyp:
List<string> someobject = new List<string>()
Wenn Sie ein Objekt neu erstellen , werden zwei Teile erstellt:
- Der Speicherblock, der Daten für ein Objekt enthält .
- Ein Verweis (Zeiger) auf diesen Datenblock.
Wenn Sie nun ein Objekt in eine Methode ohne Referenz senden, kopiert es den Referenzzeiger , NICHT die Daten. Sie haben jetzt Folgendes:
(outside method) reference1 => someobject
(inside method) reference2 => someobject
Zwei Referenzen, die auf dasselbe Objekt verweisen. Wenn Sie eine Eigenschaft für ein Objekt mithilfe von Referenz2 ändern, wirkt sich dies auf dieselben Daten aus, auf die Referenz1 verweist.
(inside method) reference2.Add("SomeString");
(outside method) reference1[0] == "SomeString" //this is true
Wenn Sie Referenz2 auf Null setzen oder auf neue Daten verweisen, wirkt sich dies weder auf Referenz1 noch auf die Datenreferenz1 aus.
(inside method) reference2 = new List<string>();
(outside method) reference1 != null; reference1[0] == "SomeString" //this is true
The references are now pointing like this:
reference2 => new List<string>()
reference1 => someobject
Was passiert nun, wenn Sie ein Objekt per Referenz an eine Methode senden ? Der tatsächliche Verweis auf ein Objekt wird an die Methode gesendet. Sie haben jetzt nur noch einen Verweis auf die Daten:
(outside method) reference1 => someobject;
(inside method) reference1 => someobject;
Aber was bedeutet das? Es verhält sich genauso wie das Senden eines Objekts, nicht mit Ausnahme von zwei Hauptsachen:
1) Wenn Sie die Referenz innerhalb der Methode auf Null setzen, wird die außerhalb der Methode auf Null gesetzt.
(inside method) reference1 = null;
(outside method) reference1 == null; //true
2) Sie können jetzt die Referenz auf einen völlig anderen Datenort verweisen, und die Referenz außerhalb der Funktion zeigt jetzt auf den neuen Datenort.
(inside method) reference1 = new List<string>();
(outside method) reference1.Count == 0; //this is true
MyClass
wäre es einclass
Typ, dh ein Referenztyp. In diesem Fall kann das Objekt , das Sie passieren die modifiziert werden ,myFunction
sogar ohneref
/out
Schlüsselwort.myFunction
erhält eine neue Referenz, die auf dasselbe Objekt verweist , und kann dasselbe Objekt beliebig ändern. Der Unterschied dieref
Keyword machen würde, wäre, dassmyFunction
der empfangene gleichen Bezug auf das gleiche Objekt. Dies wäre nur dann wichtig, wennmyFunction
der Verweis so geändert würde, dass er auf ein anderes Objekt verweist .