Autor Beitrag
Nuckey
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: So 24.04.11 16:29 
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.


ausblenden 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 ?


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97
Erhaltene Danke: 11


VS 2010, C#, AHK
BeitragVerfasst: 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)
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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.

_________________
>λ=