2009-10-17 7 views
0

S'il vous plaît, aidez-moi à ce problème:Structure Generics en C#

I Essayez de définir une structure comme ceci:

unsafe struct sNodo<T> 
{  
     public T info; 
     public sNodo<T>* sIzq;} 

mais je reçois cette erreur: Impossible de prendre l'adresse, obtenir la taille de , ou déclarer un pointeur vers un type géré sNodo,

comment puis-je résoudre ce problème? J'essaye de créer une pile "générique" en utilisant la mémoire dynamique.

Nous vous remercions de votre attention

+0

"Parce que j'ai besoin de pointeurs (mémoire dynamique)." ... euh - pourquoi? Cela ne suffit pas pour expliquer ce que vous essayez de faire. –

Répondre

9

Si tout ce que vous avez besoin est de créer une pile générique, vous n'avez pas besoin unsafe. Il suffit d'utiliser la langue normale C#:

class StackNode<T> { 
    public T info; 
    public StackNode<T> next; 
} 

Pourquoi exactement vous sentez-vous que vous avez besoin unsafe? Peut-être pensez-vous que vous avez besoin d'un pointeur car sinon votre type ne peut pas avoir une autre instance du même type qu'un membre de données. En effet, en C# si vous essayez de le faire:

struct Foo { 
    int data; 
    Foo next; 
} 

... le compilateur C# se plaindront références struct circulaires et refusent de compiler votre code (si vous ne voyez pas pourquoi il doit le faire, essayez pour savoir combien d'octets un objet Foo devrait prendre en mémoire).

Mais si vous essayez de faire la même chose avec le mot-clé class:

class Bar { 
    int data; 
    Bar next; 
} 

... tout fonctionne! Si vous venez d'un arrière-plan C++, où les classes et les structures sont plus ou moins la même chose, c'est très déroutant. Le secret est qu'en C#, les structures ont une sémantique de valeur tandis que les classes ont une sémantique de référence. Ainsi, le C++, les deux définitions ci-dessus sont les plus semblables à:

class Foo { 
    int data; 
    Foo next; // This doesn't compile in C++ either. 
} 

class Bar { 
    int data; 
    Bar* next; // But this is ok. 
} 

Ce code C++ est pas tout à fait équivalent, bien sûr, mais il devrait vous donner une idée de base de ce qu'il faut attendre.

Ligne de fond: si vous êtes en train d'apprendre C#, n'utilisez pas de structures; tout ce qu'ils peuvent faire, les classes peuvent le faire aussi. Une fois que vous avez compris la sémantique de C#, et êtes sûr que les structures sémantiques de valeur vous donnent un avantage de performance, et êtes sûr que cette amélioration des performances est importante pour votre application, allez-y et utilisez-les.

+0

Âge. Je pense que l'OP ne comprend que mal l'utilisation des types de valeur et des types de référence (structures et classes ici). – Noldorin

+6

Ou vous pouvez simplement utiliser Stack et ne pas réinventer la roue :) –

+0

Parce que j'ai besoin d'utiliser des pointeurs (mémoire dinamic). –