Quelle est la différence entre const et readonly en C# ?

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 const CONTRE les valeurs readonly qui peuvent être calculées dynamiquement mais doivent être assignées avant la fin du constructeur. Après cela, elles sont figées.

  • les const sont implicitement static. Vous utilisez la notation ClassName.ConstantName pour 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 de AssemblyB. Cela signifie que si demain je mets à jour I_CONST_VALUE à 20, AssemblyB aura toujours 2 jusqu’à ce que je le recompile.

  • dans le cas de la valeur readonly, c’est comme une ref vers un emplacement mémoire. La valeur n’est pas intégrée en dur dans le IL de AssemblyB. Cela signifie que si l’emplacement mémoire est mis à jour, AssemblyB obtient la nouvelle valeur sans recompilation. Donc si I_RO_VALUE est mis à jour à 30, vous n’avez besoin de compiler que AssemblyA et 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