Quand devrais-je utiliser une struct plutôt qu’une class en C# ?
Source : Stack Overflow,)
La source référencée par l’OP a une certaine crédibilité… mais qu’en est-il de Microsoft - quelle est leur position sur l’utilisation des struct ? J’ai cherché des informations supplémentaires auprès de Microsoft, et voici ce que j’ai trouvé :
Envisagez de définir une structure au lieu d’une classe si les instances du type sont petites et généralement de courte durée de vie ou sont couramment intégrées dans d’autres objets.
Ne définissez pas une structure à moins que le type ne possède toutes les caractéristiques suivantes :
Elle représente logiquement une valeur unique, similaire aux types primitifs (integer, double, etc.).
Elle a une taille d’instance inférieure à 16 octets.
Elle est immuable.
Elle n’aura pas à être fréquemment encapsulée (boxed).
Microsoft viole constamment ces règles
D’accord, les règles #2 et #3 en tout cas. Notre bien-aimé dictionnaire possède 2 structs internes :
[StructLayout(LayoutKind.Sequential)] // default for structs
private struct Entry //<Tkey, TValue>
{
// View code at *Reference Source
}
[Serializable, StructLayout(LayoutKind.Sequential)]
public struct Enumerator :
IEnumerator<KeyValuePair<TKey, TValue>>, IDisposable,
IDictionaryEnumerator, IEnumerator
{
// View code at *Reference Source
}
La source ‘JonnyCantCode.com’ a obtenu 3 sur 4 - ce qui est tout à fait pardonnable puisque la règle #4 ne poserait probablement pas de problème. Si vous vous retrouvez à encapsuler (boxer) une struct, repensez votre architecture.
Voyons pourquoi Microsoft utiliserait ces structs :
Chaque struct, Entry et Enumerator, représente une valeur unique.
Vitesse
Entry n’est jamais passée en paramètre en dehors de la classe Dictionary. Une investigation plus approfondie montre que pour satisfaire l’implémentation de IEnumerable, Dictionary utilise la struct Enumerator qu’il copie à chaque fois qu’un énumérateur est demandé… ce qui est logique.
Interne à la classe Dictionary. Enumerator est public parce qu
(Réponse tronquée)