<p>En dehors de la différence évidente qui est que :</p>
<ul>
<li>
<p>vous devez déclarer la valeur au moment de la définition pour un <code>const</code> CONTRE les valeurs <code>readonly</code> qui peuvent être calculées dynamiquement mais doivent être assignées avant la fin du constructeur. Après cela, elles sont figées.</p>
</li>
<li>
<p>les <code>const</code> sont implicitement <code>static</code>. Vous utilisez la notation <code>ClassName.ConstantName</code> pour y accéder.</p>
</li>
</ul>
<p>Il y a une différence subtile. Considérez une classe définie dans <code>AssemblyA</code>.</p>
<pre><code class="lang-auto">public class Const_V_Readonly
{
public const int I_CONST_VALUE = 2;
public readonly int I_RO_VALUE;
public Const_V_Readonly()
{
I_RO_VALUE = 3;
}
}
</code></pre>
<p><code>AssemblyB</code> référence <code>AssemblyA</code> et utilise ces valeurs dans le code. Quand cela est compilé :</p>
<ul>
<li>
<p>dans le cas de la valeur <code>const</code>, c’est comme un rechercher-remplacer. La valeur 2 est « intégrée en dur » dans le IL de <code>AssemblyB</code>. Cela signifie que si demain je mets à jour <code>I_CONST_VALUE</code> à 20, <em><code>AssemblyB</code> aura toujours 2 jusqu’à ce que je le recompile</em>.</p>
</li>
<li>
<p>dans le cas de la valeur <code>readonly</code>, c’est comme une <code>ref</code> vers un emplacement mémoire. La valeur n’est pas intégrée en dur dans le IL de <code>AssemblyB</code>. Cela signifie que si l’emplacement mémoire est mis à jour, <code>AssemblyB</code> obtient la nouvelle valeur sans recompilation. Donc si <code>I_RO_VALUE</code> est mis à jour à 30, vous n’avez besoin de compiler que <code>AssemblyA</code> et tous les clients n’ont pas besoin d’être recompilés.</p>
</li>
</ul>
<p>Donc si vous êtes certain que la valeur de la constante ne changera pas, utilisez un <code>const</code>.</p>
<pre><code class="lang-auto">public const int CM_IN_A_METER = 100;
</code></pre>
<p>Mais si vous avez une constante qui pourrait changer (par exemple en ce qui concerne la précision) ou en cas de doute, utilisez un <code>readonly</code>.</p>
<pre><code class="lang-auto">public readonly float PI = 3.14;
</code></pre>
<p><em>Mise à jour : Aku mérite une mention car il a souligné cela en premier. De plus, je dois mentionner la source de cet apprentissage : <a href="https://rads.stackoverflow.com/amzn/click/com/0321245660">Effective C# - Bill Wagner</a></em></p>