StructPerformance: Unterschied zwischen den Versionen

Aus Das Sopra Wiki
Greitschus (Diskussion | Beiträge)
Dietsch (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
 
(4 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 2: Zeile 2:


{{BA|Greitschus|Wenn man den Artikel noch etwas aufbläht, kann man ihn umbenennen und als Artikel für "by Value" und "by Reference" verwenden. Ich denke, das wäre sinnvoller, als nur auf das Problem mit Structs einzugehen.}}
{{BA|Greitschus|Wenn man den Artikel noch etwas aufbläht, kann man ihn umbenennen und als Artikel für "by Value" und "by Reference" verwenden. Ich denke, das wäre sinnvoller, als nur auf das Problem mit Structs einzugehen.}}
{{BA|Justus|Es gibt noch das Problem des Boxings in Listen u.ä.
<source lang="csharp">
Point p;
p.x = p.y = 1;
Object o = p;    // Verpackt den Punkt in ein Object, mit Allozieren für Objekt, Kopieren von p nach o
p = (Point)o;    // Entpackt den Punkt und kopiert ihn dann in den Platz für p.
</source>
Das kann also auch so relativ schnell recht lahm werden. Das gilt auch, wenn man Point in Listen speichert.
}}


Wenn man in C# mit [[CSharp#Structs|Structs]] arbeitet gibt es vor allem im Hinblick auf die Performance ein paar Aspekte die man beachten sollte. Dieser Artikel zeigt die Unterschiede in der Verwendung von Structs und worauf man achten muss.
Wenn man in C# mit [[CSharp#Structs|Structs]] arbeitet gibt es vor allem im Hinblick auf die Performance ein paar Aspekte die man beachten sollte. Dieser Artikel zeigt die Unterschiede in der Verwendung von Structs und worauf man achten muss.
Zeile 44: Zeile 53:
</source>
</source>


Warum ändert die Methode ''ChangeNumber1'' nun bei der Ausgabe die Zahl nicht? Zur kurzen Wiederholung: Dieses Codebeispiel verwendet [[CSharp#Klassen_und_Methoden|Klassen]] und deren Instanzen sind [[CSharp#Datentypen|reference types]]. Beim Aufruf der Methode wird also nicht direkt die Instanz der Klasse übergeben sondern nur eine Referenz, also ein Hinweis wo sich die Instanz der dahinterliegenden Klasse befindet. Da Parameter implizit mit call by value übergeben werden, also für die Methode kopiert werden, erhält die Methode quasi eine neue Referenz, welche lediglich auf die selbe Instanz der Klasse verweist wie die ursprüngliche Referenz die beim Methodenaufruf verwendet wurde. Innerhalb der Methode wird die neue Referenz dann auf eine andere Instanz der Klasse ''Test'' geändert. Beim Verlassen der Methode wird die Referenz dann automatisch gelöscht, die neue Instanz der Klasse Test mit dem Wert 3 damit also auch da sie nichtmehr referenziert wird.
Warum ändert die Methode ''ChangeNumber1'' nun bei der Ausgabe die Zahl nicht? Zur kurzen Wiederholung: Dieses Codebeispiel verwendet [[CSharp#Klassen_und_Methoden|Klassen]]. Da deren Instanzen [[CSharp#Datentypen|reference types]] sind, wird beim Aufruf der Methode nicht direkt die Instanz der Klasse übergeben sondern nur eine Referenz. Da Parameter implizit mit call by value übergeben werden, also für die Methode kopiert werden, erhält die Methode quasi eine neue Referenz, welche lediglich auf die selbe Instanz der Klasse verweist wie die ursprüngliche Referenz die beim Methodenaufruf verwendet wurde. Innerhalb der Methode wird die neue Referenz dann auf eine andere Instanz der Klasse ''Test'' geändert. Beim Verlassen der Methode wird die Referenz dann automatisch gelöscht, die neue Instanz der Klasse Test mit dem Wert 3 damit also auch da sie nichtmehr referenziert wird.
{{BA|Florian|Klasse oder Objekt?}}
{{BA|Greitschus|Ich denke, Fix hatte schon Recht mit "Objekt". Klassen werden ja nicht an Methoden übergeben, sondern nur Referenzen auf Instanzen von Klassen. Man sollte vielleicht sowas schreiben, wie "Instanzen einer Klasse sind reference Types" o.ä., damit der auszudrückende Sinn gewahrt bleibt.}}
{{BA|Florian|so?}}
{{BA|Greitschus|Jau. Klingt gut. Bis auf den ersten Satz, den find ich noch etwas verwirrt. "Dieses Codebeispiel verwendet [[CSharp#Klassen_und_Methoden|Klassen]] und deren Instanzen sind [[CSharp#Datentypen|reference types]]."}}


Die Methode ChangeNumber2 greift dagegen über die kopierte Referenz auf die selbe Klasseninstanz zurück, auf die die ursprüngliche Referenz ebenfalls verweist. Daher wird hier der Zahlenwert geändert und anschließend auch entsprechend ausgegeben.
Die Methode ChangeNumber2 greift dagegen über die kopierte Referenz auf die selbe Klasseninstanz zurück, auf die die ursprüngliche Referenz ebenfalls verweist. Daher wird hier der Zahlenwert geändert und anschließend auch entsprechend ausgegeben.