2017-07-29 5 views
-2

ich einen Code zu lesen, die mir irgend Linie zu stoppen gemacht:Warum wird die Übergabe einer Zeichenfolge an eine Methode ungleich der Liste <object>, wenn beide Referenztypen sind?

List<object> props = new List<object>(); 
DoWork(param1, param2, props); 
//props.Count grew up 

Ich dachte, dass eine Variable nicht in ihren Geltungsbereich zu ändern bedarf es als out oder ref vorbei, aber dann merkte ich, dass es sei denn, die DoWork Verfahren Änderungen die props Referenz wie:

props = new List<object>();

die Referenz wird auf die gleiche Stelle sein. Es ist also nicht notwendig, ref hier zu verwenden.

und dann habe ich eine Methode für string Typ:

static void ChangeMe(string str) 
{ 
    str = "W77"; 
} 
public static void Main(string[] args) 
{ 
    string str = "p1"; 
    ChangeMe(str); 
    //str is still "p1" 
} 

Wenn das Verhalten der Liste motiviert den Anwendungsbereich dieser Richtlinie geändert werden soll, dass es Referenzart, warum string ändert sich nicht, wenn es nicht umverteilt ist in die aufgerufene Methode und es ist ein Referenztyp wie List<object>?

Antwort

1

Grund ist, weil string ist ein unveränderlich Typ in C# und daher, wenn Sie „ändern“ es, was Sie eigentlich tun, ist eine neue string mit dem neuen Wert zu schaffen und darauf verweist.

Beim Aufruf der ChangeMe wird eine neue Referenz auf den gleichen String erstellt. Dann referenzieren Sie in der Methode die neue Referenz auf eine komplett neue Zeichenkette, die die vorherige Zeichenkette, die in Main definiert ist, nicht beeinflusst.

1

In der Funktion ChangeMe Sie eine lokale Kopie der Referenz auf das Objekt haben Sie in geben Wenn Sie speichern etwas in str Sie ersetzen diese Referenz im Grunde durch eine neue. Unveränderlichkeit spielt hier keine Rolle, weil Sie nicht wirklich versucht haben, das von str referenzierte Objekt zu modifizieren. Sie haben jetzt einen neuen Verweis gespeichert in str, der auf ein neues Objekt zeigt, das von Zeichenfolgenkonstruktor erstellt wird, wenn Sie Zeichenfolgenliteral "W77" verwenden. Und wie Sie darauf hingewiesen haben, können Sie dies außerhalb des Bereichs der Funktion durch ref oder out erreichen.

Verwandte Themen