Rolf B: C# Klasse/Speicher Array

Beitrag lesen

Hallo Henry,

eine struct ist sowas ähnliches wie eine class, nur dass C# sie als Werttyp behandelt und nicht als Referenztyp. D.h. beim Zuweisen wird die struct inhaltlich kopiert und nicht nur eine Referenz übertragen.

Heißt: eine struct ist kein Ersatz für einen Listen- oder Arraytyp.

Eine struct hat auch die Eigenschaft, dass alle Felder initialisiert werden müssen. Bei einer struct SpsItem kannst Du nicht so einfach new SpsItem() aufrufen, du musst jedes Feld initialsieren. Das kann beispielsweise ein Konstruktor tun.

wie sieht aber die Deklaration von spsItems aus ?

So: List<SpsItem> spsItems;

Wie muss ich meine "List" initialisieren, das verstehe ich noch nicht ?

So: List<SpsItem> spsItems = new List<SpsItem>();

Deklaration und Initialisierung erfolgen in einer Zeile. Genau so, wie Du es bei

int a = 9;

machst.

Weißt Du, was generische Typen sind? Eine ArrayList enthält beliebige Objekte.
Vorteil: Du kannst die Typen der Einträge – wie in PHP oder JavaScript – wild mischen. Nachteil: Die Typen können wild gemischt sein, und nach jedem Zugriff musst Du den Typ passend casten.

Eine List<T> enthält NUR Werte oder Objekte vom Typ T. Eine List<int> enthält nur Integers. Eine List<SpsItem> enthält nur SpsItem-Objekte. Willst Du etwas anderes hineinschreiben, haut Dir der Compiler das um die Ohren.
Vorteil: Du musst nicht jeden Wert casten, den Du aus einer List<T> ausliest.

Und genau wie new SpsItem() Dir ein Objekt vom Typ SpsItem erzeugt, so erzeugt ein new List<SpsItem>() Dir ein Objekt vom Typ List<SpsItem>, als leere Liste.

Ein List<T> ist technisch die getypte Version der ArrayList. Unter der Haube steckt ein echtes Array vom Typ T[], das von der .net Runtime nach Bedarf vergrößert wird (was ein Umkopieren bedeutet). Die Größe wird dabei jedesmal verdoppelt. Das zu Grunde liegende Array hat auch den Vorteil, dass Du in einer gefüllten Liste das i-te Element mit spsItems[i] lesen und auch durch ein anderes SpsItem in konstanter Zeit ersetzen kannst – .net muss dafür nicht die Liste durchlaufen.

Rolf

--
sumpsi - posui - obstruxi