Question

J'ai un type que je considère utiliser comme struct.

  • Cela représente une valeur unique
  • c'est immuable

Mais le problème est qu'il a 6 champs d'int.

Quelle solution utiliser pour ce type?

  1. continue à utiliser struct?
  2. passer en classe?
  3. ou pack 6 entiers dans un tableau d'int, il n'a donc qu'un seul champ

MODIFIER

La taille de la structure avec 6 champs entiers est de 24 octets, ce qui est énorme à contourner. La taille recommandée pour la structure ne dépasse pas 16 octets

Était-ce utile?

La solution

Cela dépend de la manière dont vous allez l'utiliser?

  1. Allez-vous en allouer beaucoup, plutôt que de le faire passer beaucoup?
  2. Est-ce que cela va être consommé par un code tiers? Dans ce cas, les classes vous offrent généralement plus de flexibilité.
  3. Voulez-vous une sémantique de classe par rapport à la structure? Par exemple, non nullable?
  4. Auriez-vous avantage à disposer de deux instances pré-créées de cette classe pouvant être réutilisées pour représenter des cas particuliers? Similaire à String.Empty. Dans ce cas, vous bénéficierez d'un cours.

Il est difficile de répondre aux informations fournies dans votre question.

Autres conseils

Attention à la boxe. Si votre structure doit être consommée par une méthode qui attend un objet, elle sera forcée dans un objet et vous aurez un impact négatif sur les performances.

Voici un référence qui l'explique plus en détail .

J'en ferais une classe (n ° 2) et vous n'auriez pas à vous en préoccuper.

L'utilisation d'un tableau de six entiers (# 3) rendrait probablement votre code plus difficile à lire. Une classe avec des identifiants descriptifs pour chaque int serait beaucoup mieux.

Sans voir votre structure, il est difficile de dire quoi que ce soit de manière définitive. Mais je suppose que vous devriez laisser cela comme une structure.

Pourquoi pas un WriteOnce<int[]>?

Je suggérerais d'écrire un petit repère pour mesurer la performance des différentes options, c'est le seul moyen de savoir avec certitude. Vous pourriez être surpris des résultats (je le suis souvent).

(Je suppose que votre préoccupation ici est la performance.)

Si le détenteur des données doit être immuable, la question de la struct-versus-classe dépendra probablement du nombre moyen de références qui existeraient pour chaque instance. Si l'on possède un tableau de TwentyFourByteStruct [1000], celui-ci prendra 24 000 octets, que chaque élément contienne une valeur différente, tous les éléments ont la même valeur ou se situent entre les deux. Si vous avez un tableau de TwentyFourByteClass [1000], celui-ci prendra 4 000 ou 8 000 octets (pour les systèmes 32/64 bits) et chaque instance distincte de TwentyFourByteClass créée nécessitera environ 48 octets. Si tous les éléments du tableau contiennent une référence au même objet TwentyFourByteClass, le total sera de 4 048 ou 8 048 octets. Si tous les éléments du tableau contiennent des références à différents objets TwentyFourByteClass, le total sera de 52 000 ou 56 000 octets.

En ce qui concerne les performances au moment de l’exécution, les meilleures performances que vous pourrez obtenir seront généralement de passer des structures par référence. Passer des structures par valeur nécessitera de les copier, ce qui peut coûter cher pour des structures de plus de 16 octets (.net inclut des optimisations pour des structures de 16 octets ou moins), mais le coût d’un type de valeur par référence est le même, qu’il soit de 1 octet ou moins. 16 000 octets.

En général, lorsque je stocke plus de deux éléments de données liés, j'aime créer une classe qui les lie. Surtout si je vais les faire circuler comme une unité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top