<p>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 <a href="http://msdn.microsoft.com/en-us/library/ms229017.aspx">auprès de Microsoft</a>, et voici ce que j’ai trouvé :</p>
<p>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.</p>
<p><strong>Ne définissez pas une structure à moins que le type ne possède toutes les caractéristiques suivantes :</strong></p>
<ul>
<li>
<p>Elle représente logiquement une valeur unique, similaire aux types primitifs (integer, double, etc.).</p>
</li>
<li>
<p>Elle a une taille d’instance inférieure à 16 octets.</p>
</li>
<li>
<p>Elle est immuable.</p>
</li>
<li>
<p>Elle n’aura pas à être fréquemment encapsulée (boxed).</p>
</li>
</ul>
<p>Microsoft viole constamment ces règles</p>
<p>D’accord, les règles <span class="hashtag-raw">#2</span> et <span class="hashtag-raw">#3</span> en tout cas. Notre bien-aimé dictionnaire possède 2 structs internes :</p>
<pre><code class="lang-auto">[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
}
</code></pre>
<p>*<a href="http://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs,d3599058f8d79be0">Reference Source</a></p>
<p>La source ‘<a href="http://JonnyCantCode.com">JonnyCantCode.com</a>’ a obtenu 3 sur 4 - ce qui est tout à fait pardonnable puisque la règle <span class="hashtag-raw">#4</span> ne poserait probablement pas de problème. Si vous vous retrouvez à encapsuler (boxer) une struct, repensez votre architecture.</p>
<p>Voyons pourquoi Microsoft utiliserait ces structs :</p>
<ul>
<li>
<p>Chaque struct, <code>Entry</code> et <code>Enumerator</code>, représente une valeur unique.</p>
</li>
<li>
<p>Vitesse</p>
</li>
<li>
<p><code>Entry</code> 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 <code>Enumerator</code> qu’il copie à chaque fois qu’un énumérateur est demandé… ce qui est logique.</p>
</li>
<li>
<p>Interne à la classe Dictionary. <code>Enumerator</code> est public parce qu</p>
</li>
</ul>
<p><em>(Réponse tronquée)</em></p>