StructPerformance: Unterschied zwischen den Versionen

Aus Das Sopra Wiki
Florian (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
Florian (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
Zeile 45: Zeile 45:


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.
Das selbe Prinzip gilt ähnlich auch für [[CSharp#Structs|Structs]]. Da Structs allerdings [[CSharp#Datentypen|value types]] sind, wird beim Übergeben einer Struct als Parameter nicht nur eine Referenz, sondern der komplette Inhalt der Struct kopiert! Dies kann je nach Inhalt der Struct (z.B. 16 float Werte bei einer Matrix-Struct) relativ lange dauern und damit die Performance des Spiels massiv verschlechtern wenn Structs sehr häufig als Parameter übergeben werden! Zudem funktioniert das obige Beispiel für Klassen nicht mit Structs, da ja die gesamte Struct beim Übergeben kopiert wird:
<source lang="csharp">
public class MyApp
{
  public static void Main()
  {
    Vector3 test = new Vector3(7.0f);
    ChangeVector1(test);
    System.Console.WriteLine(test);  // gibt {X:7 Y:7 Z:7} aus
    ChangeVector2(test);
    System.Console.WriteLine(test);  // gibt auch {X:7 Y:7 Z:7} aus
  }
  public void ChangeVector1(Vector3 vector)
  {
    vector = new Vector3(3.0);
  }
  public void ChangeVector2(Vector3 vector)
  {
    vector.x = 3.0;
    vector.y = 3.0;
    vector.z = 3.0;
  }
}
</source>
Die call by value Übergabe gilt auch für einfache Zuweisungen


== Call by Reference ==
== Call by Reference ==


== Rückgabewerte == [[Kategorie:Code-Beispiele]]
== Rückgabewerte == [[Kategorie:Code-Beispiele]]