*
Freut mich, dass du genauer wissen willst, was denn nun Sache ist
GaDgeT schrieb:
Mich würde nun schon genauer interessieren, wann etwas auf dem Heap und wann auf dem Stack angelegt wird. Ich dachte nämlich auch auf dem Heap.
Als Faustregel kann man sagen, dass in C# struct s per new immer auf dem Stack erstellt werden (was nicht heisst, dass sie danach nicht doch irgendwo auf dem Heap gespeichert werden können, so etwa als Bestandteil einer anderen Klasse.). struct s sind intern Klassen, welche von System.ValueType erben. Alle Klassen, welche das nicht tun (sprich: class -Typen), werden von C# als so genannte Referenztypen behandelt. Für dich heisst dies, dass du implizit immer eine Referenz auf einen solchen Typen deklarierst, wenn du dessen Namen benutzt zur deklaration einer Variablen benutzt. So ist eine Variable vom Typ object in C# ist ein Wirklichkeit ein *Handle, welches sich auf dem Stack befinden kann, auf ein System.Object *, welches sich seinerseits aber immer auf dem verwalteten Heap befinden muss. Diese Typen werden daher bei einem Aufruf von new jeweils auf dem Heap allokiert. Die Tatsache, dass rein syntaktisch keine Unterscheidung vorgenommen wird, ärgert mich in C# fast am meisten (und ist mit ein Grund, warum ich C++/CLI bevorzuge. Dort werden alle diese Dinge explizit unterschieden, was für den Zweck der Sprache auch nötig ist :D).
Um es noch weiter zu verkomplizieren gibt es auch noch das so genannte Boxing, wo Werttypen (nicht vergessen, System.ValueType ;)) nach object oder einer bestimmten Schnittstelle (beides keine struct s...) konvertiert werden. Vielleicht ist dir bereits einmal aufgefallen, dass man einer Variable vom Typ object alles zuweisen kann, struct s eingeschlossen. Beim Boxing wird wird ein solches struct auf den Heap verschoben, bzw. gleich dort erstellt.
// C# Boxing
object foo = new UInt32(); // UInt32 ist ein struct, und dennoch wird es hier direkt auf den Heap verfrachtet.
MfG