Question Resharper me suggérant toujours de faire une chaîne de caractères const au lieu d'une chaîne


lequel est bon:

string sQuery = "SELECT * FROM table";

ou

const string sQuery = "SELECT * FROM table";

Et pourquoi refaire toujours me suggérer de le faire?


10
2018-05-26 08:57


origine


Réponses:


Ce dernier est meilleur - cela signifie que:

  • Ce n'est pas une variable d'instance, vous ne vous retrouvez donc pas avec une référence de chaîne redondante dans chaque instance que vous créez.
  • Vous ne pourrez pas changer la variable (que vous ne voulez probablement pas)

Il y a d'autres effets de "const" en termes d'accès à partir d'autres assemblys et de versions, mais il semble que ce soit un domaine privé, cela ne devrait donc pas être un problème. Vous pouvez la plupart Pensez-y comme étant:

static readonly string sQuery = ...;

En général, je pense que c'est une bonne idée de rendre les champs statiques quand vous le pouvez (si cela ne varie pas selon l'instance, pourquoi devrait-il s'agir d'une variable d'instance?) Et en lecture seule lorsque cela est possible . Faites-moi savoir si vous voulez que je rentre dans les détails des différences entre static readonly et const.


20
2018-05-26 08:59



Si la chaîne ne change jamais et n'est jamais utilisée en dehors de votre assembly, alors const est une bonne idée. S'il ne change jamais mais est utilisé en dehors de votre assembly, statique readonly peut être une meilleure idée - les consts sont "gravés" sur le site de l'appel, pas stockés dans un emplacement, donc recompiler l'assembly qui contient le const ne met pas à jour les assemblys dépendants - ils doivent être recompilés aussi. Les variables readonly statiques, par contre, sont mises à jour dans les assemblys dépendants.


4
2018-05-26 08:59



ReSharper ne le suggère que si la référence de chaîne particulière ne change jamais. Dans ce cas, vous exprimez votre intention en utilisant const string au lieu de juste string.


1
2018-05-26 08:58



Cela se produit car si vous attribuez accidentellement une nouvelle valeur à sQuery dans votre code, s'il s'agit d'une constante, vous obtiendrez une erreur de compilation, ce qui provoquera un bogue au moment de la compilation. Même avec sa suggestion de faire des variables membres qui sont définies dans le ctor seulement pour être en lecture seule


1
2018-05-26 08:59