private const vs public readonly
J'ai trois fichiers de classe où en constante est déclarée comme
private const string PAGE_SIZE = "PageSize";
Est-il bon d'aller dans ce nouveau fichier pour tous les constantes déclarées comme
public readonly string PageSize = "PageSize";
Quels sont les avantages et les inconvénients de cette situation?
OriginalL'auteur Sreedhar | 2011-08-25
Vous devez vous connecter pour publier un commentaire.
Il existe des différences importantes entre un
const
et unreadonly
champ:La
const
est évaluée au moment de la compilation. Si vous déclarez laconst
dans un ensemble distinct que vous faites référence à partir de l'application d'un changement à laconst
n'affecte l'application si elle est recompilé à l'aide de la mise à jour de l'assemblée. Pour citer le .NET Les lignes Directrices de conception pour le Développement de Bibliothèques de Classe:Un
readonly
champ peut être initialisé au moment de l'exécution, vous permettant d'effectuer au moment de l'exécution de calculs de la valeur et de l'utilisation. Unconst
ne peut être déclarée par une expression constante qui peut être pleinement évalués au moment de la compilation. Le seul type de référence qui peut êtreconst
estString
.À propos de votre question, cela dépend vraiment de la façon dont ces constantes sont utilisées. Évidemment, vous ne devriez pas avoir plusieurs définitions de la même constante. Sinon, il est probablement plus facile à comprendre si la constante est déclarée "près de", où il est utilisé, par exemple, dans la classe ou même de la méthode, où il est utilisé.
Barrass: Si votre application utilise une recompilation de l'assemblée au moment de l'exécution (en charge) de votre application ne verrez pas de modifications constantes dans cette assemblée. Vous application va utiliser les constantes qui a été défini quand il a été compilé. Si liés assemblée est modifié et déployé à-dire le patch de votre demande, vous faire face au risque de votre application se mettre "out of sync" avec les constantes. Vous application peut être une application web et le lien de l'assemblée d'un cadre qui est mis à jour sur le serveur live sans votre application d'être recompilé.
Ta; cela ne devrait pas être, mais est contre-intuitif pour moi, donc aura un jeu plus tard aujourd'hui, grâce à La modifier permet de (compilateur de l'insertion de la valeur directe). J'aurais cependant que E et PI en mathématiques lib pourrait changer, si quelqu'un décide qu'une augmentation ou une diminution de la précision est plus approprié 😉 Mais c'est pédantisme, le point de la documentation est pris ..
OriginalL'auteur Martin Liversage
Des performances au-delà des considérations -
En faveur: votre constantes sont toutes centralisées en un seul endroit.
Contre: votre constantes ne sont plus proche de l'endroit où ils sont utilisés.
Pour les constantes qui sont partagés entre les classes, il est logique de les sortir pour une commune seule classe de sorte qu'ils sont spécifiés uniquement une fois. Toutefois cela implique "inapproprié de couplage", donc peut-être que toute la logique qui utilise cette constante doit être dans la même classe.
OriginalL'auteur Jeremy McGee
Les deux peuvent avoir les mêmes effets pratiques, mais ils sont utiles pour la signalisation de vos intentions.
Donc, const valeur est quelque chose qui est disponible à toutes les instances de votre classe et ne changera jamais. Un readonly signaux que vous avez une valeur de données qui pourrait être différent pour chaque instance de vous en classe, mais sera immuable une fois que la classe est créée. L'immutabilité peut être vraiment utile de garantie lors d'un partage de l'instance de la classe entre les différents consommateurs. En passant, dans le CLR Via C#, Richter préfère readonly le public et les membres des propriétés avec seulement public setters, je vais devoir creuser et de me rappeler pourquoi.
OriginalL'auteur Aidan
Il pourrait être que vous êtes en optimisant trop tôt.
Cela pourrait signifier perdre de la souplesse en faisant les constantes partagé et public-difficile à dire sans savoir ce que les classes existantes.
Que si PageSize doit varier entre elles à l'avenir? Est-il réellement besoin d'être synchronisés sur l'ensemble des trois classes, ou est-ce juste un petit tweak qui semble être une bonne idée à l'heure actuelle?
OriginalL'auteur Tim Barrass