Si une entité doit être immuable, la question de l'utilisation d'une structure ou d'une classe sera généralement une question de performance plutôt que de sémantique. Sur un système 32/64 bits, les références de classe nécessitent 4/8 octets à stocker, quelle que soit la quantité d'informations dans la classe; la copie d'une référence de classe nécessite la copie de 4/8 octets. D'autre part, tous distinctsl'instance de classe aura 8/16 octets de surcharge en plus des informations qu'elle contient et du coût de la mémoire des références. Supposons que l'on veuille un tableau de 500 entités, chacune contenant quatre entiers 32 bits. Si l'entité est un type de structure, le tableau nécessite 8 000 octets, que les 500 entités soient toutes identiques, toutes différentes ou quelque part entre les deux. Si l'entité est un type de classe, le tableau de 500 références prendra 4 000 octets. Si ces références pointent toutes vers des objets différents, les objets nécessiteraient 24 octets supplémentaires chacun (12 000 octets pour les 500), soit un total de 16 000 octets, soit le double du coût de stockage d'un type struct. D'un autre côté, du code a créé une instance d'objet, puis copié une référence aux 500 emplacements de tableau, le coût total serait de 24 octets pour cette instance et 4, 000 pour la baie - un total de 4 024 octets. Une économie importante. Peu de situations fonctionneraient aussi bien que la dernière, mais dans certains cas, il peut être possible de copier certaines références dans suffisamment d'emplacements de tableau pour que ce partage en vaille la peine.
Si l'entité est censée être mutable, la question de savoir s'il faut utiliser une classe ou une structure est à certains égards plus facile. Supposons que "Thing" soit une structure ou une classe qui a un champ entier appelé x, et on fait le code suivant:
Chose t1, t2;
...
t2 = t1;
t2.x = 5;
Veut-on que cette dernière instruction affecte t1.x?
Si Thing est un type de classe, t1 et t2 seront équivalents, ce qui signifie que t1.x et t2.x seront également équivalents. Ainsi, la deuxième instruction affectera t1.x. Si Thing est un type de structure, t1 et t2 seront des instances différentes, ce qui signifie que t1.x et t2.x feront référence à des entiers différents. Ainsi, la deuxième instruction n'affectera pas t1.x.
Les structures mutables et les classes mutables ont des comportements fondamentalement différents, bien que .net ait quelques bizarreries dans sa gestion des mutations struct. Si l'on veut un comportement de type valeur (ce qui signifie que "t2 = t1" copiera les données de t1 vers t2 tout en laissant t1 et t2 comme des instances distinctes), et si l'on peut vivre avec les caprices de la gestion des types de valeur par .net, utilisez une structure. Si l'on veut une sémantique de type valeur mais que les caprices de .net entraîneraient une sémantique de type valeur cassée dans son application, utilisez une classe et marmonnez.