C #: Warum wird dieses Objekt nach der Ausführung der Funktion nicht verändert?

8

Ich dachte immer, dass Objekte immer als Referenz in C # übergeben werden und dass, wenn eine Funktion sie modifiziert, die übergeordnete Methode eine modifizierte Version dieses Objekts haben sollte. Das Lesen dieses Codes, der von einem alten Entwickler hinterlassen wurde, der einen Fehler verursacht hat, lässt mich jedoch denken, dass dies nicht immer der Fall ist. Der Code ist der folgende:

%Vor%

Der Funktionscode lautet wie folgt:

%Vor%

Wenn ich "ref" mit dem Element verwende, funktioniert es, aber ich dachte, dies sei nur für Werttypen wie "int" oder "double".

    
groovejet 19.09.2011, 15:11
quelle

3 Antworten

17

Ich gehe davon aus, dass Sie meinen, dass Sie erwarten, dass "Element" bei der Rückkehr von der Methode geändert wird. Das Problem ist hier:

%Vor%

Sie ändern das Variablenelement so, dass es auf den Parameter sodItem verweist, sodass es nicht mehr auf dasselbe Element verweist, das übergeben wurde. Der ursprüngliche Verweis "item" wurde nie geändert. Wenn Sie den Parameter 'item' auf 'ref' setzen, wird die ursprüngliche Referenz der als Parameter übergebenen Variablen geändert.

Beachten Sie, dass dieser aktuelle Code das ursprüngliche sodItem (das Kopieren eigener Werte in sich selbst) modifiziert, was möglicherweise nicht Ihre Absicht ist.

    
Dan Bryant 19.09.2011, 15:15
quelle
13

Ich habe ein Stück Papier mit einer Adresse darauf: 123 Sesamstraße. Ich gebe dir eine Fotokopie des Stück Papiers.

Sie gehen zur 123 Sesamstraße und finden ein blaues Haus. Du malt das Hausgrün.

Sie streichen dann 123 Sesame Street auf Ihrer Fotokopie und ersetzen sie durch 1600 Pennsylvania Avenue.

Mein Stück Papier mit der Adresse ändert sich nicht. Ich gehe in die Sesamstraße 123, und tatsächlich ist das Haus jetzt grün.

Siehst du? Das Haus wurde bei meiner Fotokopie als "Referenz" bezeichnet. Das Stück Papier ist kein Haus; es ist ein Hinweis auf ein Haus. Eine Kopie dieser Referenz ist noch eine Referenz auf das Haus. Das Ändern einer Referenz ändert keine andere Referenz; Wenn Sie ändern, ändert sich die Farbe des Objekts, auf das verwiesen wird , für alle Referenzen.

Nehmen wir an, ich teile mein Stück Papier mit Ihnen, anstatt eine Kopie zu machen . Wenn Sie nun die 123 Sesamstraße auskratzen und sie durch 1600 Pennsylvania Avenue ersetzen, sehe ich die Änderung, weil wir teilen die gleiche Referenz haben. Sie teilen eine Variable mit einer Methode, indem Sie das Schlüsselwort "ref" verwenden.

Macht Sinn?

    
Eric Lippert 19.09.2011 16:05
quelle
4

Sie müssen das Schlüsselwort ref verwenden, um dies zum Funktionieren zu bringen. Der Unterschied ist subtil ... Wenn Sie ein Objekt übergeben, wird der Zeiger nach Wert übergeben, dh es wird kopiert. Jetzt haben Sie also zwei Zeiger, die auf dieselbe Sache zeigen. Wenn Sie dann dem Parameterzeiger ein neues Objekt zuweisen, haben Sie keinen Einfluss auf den ursprünglichen Zeiger. Er zeigt immer noch auf das Original.

Wenn Sie ref verwenden, wird der Zeiger buchstäblich übergeben. Wenn Sie ihn neu zuweisen, wird der ursprüngliche Zeiger ebenfalls neu zugewiesen.

Weitere Informationen hier ... Ссылка

Um Ihre Arbeit zu machen, werden Sie entweder ...

a) muss das Schlüsselwort ref oder verwenden b) tue diesen Gegenstand = (Gegenstand) sodItem; bevor Sie es an die Methode übergeben

    
iDevForFun 19.09.2011 15:17
quelle

Tags und Links