Entwickler-Ecke
C# - Die Sprache - Gemischte klassen mit Struct ?
Nuckey - So 24.04.11 16:29
Titel: Gemischte klassen mit Struct ?
ein hallöchen erst mal ! ;)
ich habe folgende verständniss frage.
laut buch werden klassen auf dehm heap erstellt und struct im stack
aber wie wird es gehandhabt wenn struct in klassen vorkommen.
zb.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| public struct Test0 { public string id0; public string id1; }
public class Test1 { public Test0 test0; } |
da hier Test0 als werttype verwendet wird müste dieser im stack erstellt werden,aber da die klasse auf dehm heap erstellt wird ???????
tja ,wird nun test0 mit auf dehm heap erstellt?
wie sähe es aus wenn Test0 in der Klasse eingebettet wird ?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| public class Test1 { public Test0 test1 = new Test0();
public struct Test0 { ........... ........... }
} |
ich hoffe jemand kann licht ins dunkel bringen
mfg nuckey
Moderiert von
Kha: C#-Tags hinzugefügt
Kha - So 24.04.11 18:38
:welcome: in der EE!
Nuckey hat folgendes geschrieben : |
tja ,wird nun test0 mit auf dehm heap erstellt? |
Ganz genau, innerhalb der Test1-Objekte, das ist die einzige Möglichkeit. Da kann ich mich nur fragen, in welchem Buch so ein Unsinn verzapft wird.
Manche [
http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx] meinen auch, die Sache mit dem Stack zu erwähnen sei gar nicht wichtig.
Nuckey hat folgendes geschrieben : |
wie sähe es aus wenn Test0 in der Klasse eingebettet wird ? |
Inner Types ändern nur die Sichtbarkeit, aber nichts am Verhalten.
Nuckey - So 24.04.11 19:29
hio danke erstmal für die antwort
im buch stand dieses so nicht drinne,aber die frage warf sich mir auf
da ich zur zeit an einem editor für sacred2 arbeite und die daten in verschachtelten c/c++ strukturen vorhanden sind und ich diese so nahe wie möglich in c# portieren will.
um es nochmal zusammen zufassen :
wenn struct Test0 in Class Test1 als werttype oder als instanz (per new) deklariert wird,wird bei der zuweisung per new Test1 auch Test0 auf dehn heap Allociert.
mfg nuckey
IsNull - Do 28.04.11 13:59
Zitat: |
wenn struct Test0 in Class Test1 als werttype oder als instanz (per new) deklariert wird |
Huh? Ein struct kann man nicht als Instanz deklarieren/erstellen. Das new Keyword ist da evtl etwas missführend.
Ein Struct hat immer einen paraameterlosen default Constructor, der aufgerufen wird wenn der Struct nicht explizit erstellt wird. Eg: (Point sei ein Struct mit den öffentlichen Properties X & Y)
C#-Quelltext
1: 2:
| Point mypnt; mpnt.X ;---> enthällt 0 |
Eine explizite Zuweisung/"Instanzierung" ist nicht nötig. Ein struct kann schon daher nie NULL sein.
Folgendes ist gleichwertig:
C#-Quelltext
1: 2:
| Point mypnt = new Point(0,0); mpnt.X ;---> enthällt 0 |
Sobald du deine Structs in Klassen hast, landen die sowieso auf dem Heap; Sehr oft hat man diese ja in Listen usw. Lediglich bei lokalen Variablen / (evtl. Rekursionen) landen diese auch wirklich auf dem Stack.
However, in C# sollte das Design nicht nach solchen Performance Details ausgelegt werden (diese sind IMHO minimal), sondern ob es sich bei den Elementen wirklich um identitätslose Werte handelt.
Kha - Do 28.04.11 20:34
IsNull hat folgendes geschrieben : |
Ein Struct hat immer einen paraameterlosen default Constructor, der aufgerufen wird wenn der Struct nicht explizit erstellt wird. |
Probier es mal selbst aus ;) .
Lokale Variablen müssen
immer initialisiert werden. Die Ausnahmeregelung, dass bei Structs alternativ alle Felder befüllt werden können, kann man dank Kapselung wohl getrost vernachlässigen.
IsNull hat folgendes geschrieben : |
However, in C# sollte das Design nicht nach solchen Performance Details ausgelegt werden (diese sind IMHO minimal), sondern ob es sich bei den Elementen wirklich um identitätslose Werte handelt. |
Genau andersherum würde ich sagen - für ein identitätsloses Objekt ist eine Klasse nicht weniger geeignet als ein Struct, das sollte also keine Entscheidungshilfe sein (außer natürlich
gegen Structs). Deswegen kann ich nur wiederholen, dass man immer, immer, immer mit einer Klasse starten sollte, und nur wechseln darf, wenn es ein Profiler nahelegt und die Guidelines es erlauben.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!