Créer un tableau/Liste des structures lorsque la structure contient un tableau/Liste
Je suis novice en C#, normalement, un programmeur en C donc je vais avoir de la difficulté à déterminer la meilleure méthode à utiliser. J'espère que je peux obtenir quelques conseils pour m'aider à me décider.
J'ai une structure qui ressemble à ceci (je l'ai fait comment j'allais le faire en C):
struct structData
{
long type;
long myArray[50];
string text;
}
- Je créer un tableau de ces struct que je puisse constamment en lecture/écriture à l'échelle mondiale/public. (J'ai besoin de stocker les données là-bas, alors il peut être consulté à un moment plus tard)
structData arrayOfStructs[50];
Le but serait d'accéder aux données comme ceci:
arrayOfStructs[0].type = 123;
arrayOfStructs[0].myArray[0] = 456;
Quand j'essaie de le mettre en C#, je reçois un certain nombre d'erreurs:
"myArray
" doit fixée à 50, mais il doit être dans la zone dangereuse
Si j'essaie d'initialiser "... = new ...
" j'obtiens une erreur
Tout d'abord, je devrais être en utilisant la Liste des<> au lieu des tableaux? Est-il une différence de performance?
Deuxièmement, je dois créer une classe au lieu d'une structure, l'initialiser dans le constructeur, puis créer une liste ou un tableau d'objets? Comment voulez-vous mettre en œuvre?
Et oui j'ai besoin d'utiliser longs.
Tout simplement parce que la syntaxe est semblable ne veut pas dire que vous devriez écrire du code C en C#.
Je n'essaie pas d'écrit en C en C# je viens de dire comment j'allais le faire en C pas ce que je dois faire. C'est pourquoi j'ai demandé à ce que je dois faire.
OriginalL'auteur Nick Sinas | 2011-03-10
Vous devez vous connecter pour publier un commentaire.
De l'utilisation des classes pour les gros objets, les structures pour les petites et éventuellement immuable "objets" (permet de dire que les structures DOIVENT être de petite taille ET immuable. Ils peuvent être cependant vous voulez)
Pour être clair, le plus grand struct je sais .NET est composé de 4 int (c'est le Guid). Je pense que c'est un bon point de repère pour les petits contre les grandes structures.
Utiliser la Liste si vous avez besoin pour développer vos collections, tableaux si la taille est fixe, la Liste n'est pas beaucoup plus lent que les tableaux (ils utiliser à l'interne d'un tableau). Je ne sais pas si quelqu'un a déjà comparé un tableau à une Liste. Liste utilise normalement un peu plus de mémoire qu'un tableau, parce qu'il garde un peu d'espace pour agrandir la collection (et il garde la taille actuelle de la Liste et un pointeur vers le tableau interne, et peut-être d'autres données. Il est donc au moins de plus gros par un int et un pointeur, en plus de la std généraux de tous les objets). Vous pouvez "presize" la Liste en passant au constructeur le nombre d'éléments de la réserve.
J'ai une erreur quand j'essaie d'écrire au tableau. J'ai utilisé cette ligne: datas[0].type = 123;
Quelle est l'erreur que vous obtenez? J'ai testé le code et c'est ok.
Une exception non gérée du type 'System.NullReferenceException' s'est produite dans ...
Vous devez initialise les éléments de données. StructData[] datas = new StructData[100]; initialise le tableau (le contenant), mais vous devez les initialiser les éléments singuliers. Ajouté les lignes de l'exemple.
OriginalL'auteur xanatos
Donc, laissez-moi d'abord de dire que vous devriez éviter la tentation d'écrire du code C en C#. Outre les évidentes similitudes syntaxiques, les deux langues ont peu de choses en commun.
En C#, vous aurez rarement l'utilisation des structures. La sémantique d'une struct sont différents de ceux d'une classe. Voici un rapide aperçu sur l'utilisation d'un struct v lors de l'utilisation d'une classe. Il y a plus de ressources disponibles, j'ai juste attrapé le premier résultat qui a frappé sur le sujet et semble raisonnable: Quand utiliser une struct
Deuxième, oui, vous devriez être en utilisant générique types de conteneurs chaque fois que possible. La Performance ne sera pas un problème et il rendra votre vie beaucoup plus facile dans le long terme. votre syntaxe pour la déclaration du tableau est désactivé (c'est différent de C) et doit être:
Si vous avez besoin de la matrice à être épinglé dans la mémoire pour l'interopérabilité des fins que vous pouvez accomplir ceci par le
fixed
mot-clé, mais la couche d'interopérabilité en fait cela pour vous de toute façon, lorsque vous passez d'une matrice à une fonction native.Je vous recommande de passer un peu de temps à apprendre C# à partir du sol et d'oublier le fait que la syntaxe est similaire à C. Ils sont complètement différents des langues totalement différentes de la sémantique et de meilleures pratiques.
OriginalL'auteur Ed S.
Si vous avez besoin d'natif de l'interopérabilité, c'est-à-dire, vous allez maréchal de ces types grâce à un mécanisme ou tout simplement de la coulée autour des tableaux d'octets, alors vous avez besoin de ce dangereux/fixe choses et il peut être fait comme ça.
À venir à partir de C, vous devriez certainement pas traduire directement du code C dans le C# équivalent, car cela fait peu de sens. En C#, les choses sont gérées et vous acceptent généralement les coûts associés avec le code géré et ne pensent pas aux conséquences de performance à ce niveau, pas au premier abord, de toute façon.
Un bon endroit pour commencer serait d'étudier le modèle de mémoire de C#, car elle explique beaucoup de choses subtiles, mais importantes différences entre les types de valeurs et de références types.
OriginalL'auteur John Leidegren