En C #, quelle est la différence entre
static readonly string MyStr;
et
const string MyStr;
?
En C #, quelle est la différence entre
static readonly string MyStr;
et
const string MyStr;
?
Réponses:
Lorsque vous utilisez une constchaîne, le compilateur incorpore la valeur de la chaîne au moment de la compilation .
Par conséquent, si vous utilisez une constvaleur dans un autre assembly, puis mettez à jour l'assembly d'origine et modifiez la valeur, l'autre assembly ne verra pas la modification jusqu'à ce que vous le recompiliez .
Une static readonlychaîne est un champ normal qui est recherché lors de l'exécution. Par conséquent, si la valeur du champ est modifiée dans un autre assembly, les modifications seront visibles dès que l'assembly est chargé, sans recompilation.
Cela signifie également qu'une static readonlychaîne peut utiliser des membres non constants, tels que Environment.UserNameou DateTime.Now.ToString(). Une constchaîne ne peut être initialisée qu'à l'aide d'autres constantes ou littéraux.
En outre, une static readonlychaîne peut être définie dans un constructeur statique; une constchaîne ne peut être initialisée qu'en ligne.
Notez que a static stringpeut être modifié; vous devriez utiliser à la static readonlyplace.
constne devrait être utilisée que pour les constantes - les constantes étant des valeurs qui ne changent jamais , jamais , jamais .
private constpour des valeurs qui ne sont pas, à proprement parler, des constantes; fondamentalement, c'est abusif constà des fins de micro-optimisation. Je vais rester fidèle à ma déclaration «jamais, jamais, jamais» , même si cela fait de moi un hypocrite. ;)
Voici une bonne répartition des avantages et des inconvénients :
Ainsi, il semble que les constantes doivent être utilisées lorsqu'il est très peu probable que la valeur change un jour, ou si aucune application / bibliothèque externe n'utilise la constante. Les champs statiques en lecture seule doivent être utilisés lorsqu'un calcul d'exécution est requis ou si des consommateurs externes sont un facteur.
constpublic const string MyStr;
est une constante de temps de compilation (vous pouvez l'utiliser comme paramètre par défaut pour un paramètre de méthode par exemple), et elle ne sera pas obscurcie si vous utilisez une telle technologie
static readonlypublic static readonly string MyStr;
est la constante d' exécution . Cela signifie qu'il est évalué au lancement de l'application et pas avant. C'est pourquoi il ne peut pas être utilisé comme paramètre par défaut pour une méthode (erreur de compilation) par exemple. La valeur qui y est stockée peut être obscurcie.
OQ interrogé sur static stringvs const. Les deux ont des cas d'utilisation différents (bien que les deux soient traités comme statiques).
N'utilisez const que pour des valeurs vraiment constantes (par exemple, la vitesse de la lumière - mais même cela varie en fonction du support). La raison de cette directive stricte est que la valeur const est substituée dans les utilisations du const dans les assemblys qui le référencent, ce qui signifie que vous pouvez avoir des problèmes de version si le const change à sa place de définition (c'est-à-dire qu'il n'aurait pas dû être une constante après tout). Notez que cela affecte même les private constchamps car vous pouvez avoir la base et la sous-classe dans différents assemblys et les champs privés sont hérités .
Les champs statiques sont liés au type dans lequel ils sont déclarés. Ils sont utilisés pour représenter des valeurs qui doivent être identiques pour toutes les instances d'un type donné. Ces champs peuvent être écrits autant de fois que vous le souhaitez (sauf indication contraire en lecture seule).
Si vous vouliez dire static readonlyvs const, je le recommanderais static readonlypour presque tous les cas, car il est plus à l'épreuve du temps.
Vous pouvez modifier la valeur de a static readonly stringuniquement dans le staticconstructeur de la classe ou dans un initialiseur de variable, alors que vous ne pouvez pas modifier la valeur d'une constchaîne n'importe où.