Quelle est la différence entre const et readonly en C# ?
En dehors de la différence évidente qui est que :
-
vous devez déclarer la valeur au moment de la définition pour un
constCONTRE les valeursreadonlyqui peuvent être calculées dynamiquement mais doivent être assignées avant la fin du constructeur. Après cela, elles sont figées. -
les
constsont implicitementstatic. Vous utilisez la notationClassName.ConstantNamepour y accéder.
Il y a une différence subtile. Considérez une classe définie dans AssemblyA.
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;
}
}
AssemblyB référence AssemblyA et utilise ces valeurs dans le code. Quand cela est compilé :
-
dans le cas de la valeur
const, c’est comme un rechercher-remplacer. La valeur 2 est « intégrée en dur » dans le IL deAssemblyB. Cela signifie que si demain je mets à jourI_CONST_VALUEà 20,AssemblyBaura toujours 2 jusqu’à ce que je le recompile. -
dans le cas de la valeur
readonly, c’est comme unerefvers un emplacement mémoire. La valeur n’est pas intégrée en dur dans le IL deAssemblyB. Cela signifie que si l’emplacement mémoire est mis à jour,AssemblyBobtient la nouvelle valeur sans recompilation. Donc siI_RO_VALUEest mis à jour à 30, vous n’avez besoin de compiler queAssemblyAet tous les clients n’ont pas besoin d’être recompilés.
Donc si vous êtes certain que la valeur de la constante ne changera pas, utilisez un const.
public const int CM_IN_A_METER = 100;
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 readonly.
public readonly float PI = 3.14;
Mise à jour : Aku mérite une mention car il a souligné cela en premier. De plus, je dois mentionner la source de cet apprentissage : Effective C# - Bill Wagner