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 user profile iconKha: C#-Tags hinzugefügt


Kha - So 24.04.11 18:38

:welcome: in der EE!


user profile iconNuckey hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconNuckey hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconIsNull hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconIsNull hat folgendes geschrieben Zum zitierten Posting springen:
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.