62 votes

Comment arrêter de C# à partir de remplacement de variable const avec leurs valeurs?

Nous avons un projet qui est compilé dans une DLL appelée consts.dll qui contient quelque chose comme:

public static class Consts
{
    public const string a = "a";
    public const string b = "b";
    public const string c = "c";
}

Nous avons plusieurs projets de ce type, chaque compilé dans une DLL du même nom (consts.dll) et nous les remplacer selon le besoin. Nous avons une autre classe qui utilise ces consts:

public class ConstsUser 
{
    string f() { return Consts.a; }
}

Malheureusement, Consts.a est optimisé pour "un" , de sorte que même si nous remplacer Consts.dll la mise en œuvre, nous obtenons toujours "un" au lieu de la valeur correcte et nous avons besoin de recompiler ConstsUser. Est-il de toute façon à arrêter l'optimiseur de remplacement const variables avec leurs valeurs?

118voto

Sergey Berezovskiy Points 102044

Je pense que l'utilisation de l' static readonly modificateurs s'adapte à vos besoins:

public static class Consts
{
    public static readonly string a = "a";
    public static readonly string b = "b";
    public static readonly string c = "c";
}

Les constantes sont codés en dur sur l'appel site, c'est votre problème. Static readonly variable peut être modifiée que dans la déclaration de la variable ou le constructeur statique d' Consts classe, et il ne sera pas insérée sur l'appel-site.

36voto

Khanh TO Points 21297

Dans le livre CLR via c#

Lorsque le code fait référence à un symbole de constante, les compilateurs de rechercher le symbole les métadonnées de l'assemblée qui définit la constante, extrait de l' constante de la valeur, et intégrer la valeur dans le émise Intermédiaire Langue (IL) du code. Car une constante de valeur est directement intégré dans code, les constantes ne nécessite pas de mémoire à allouer à runtime. En outre, vous ne pouvez pas obtenir l'adresse d'une constante et vous on ne peut pas passer d'une constante par référence. Ces contraintes signifie également que les constantes n'ont pas une bonne croix-assemblée versionnement de l'histoire, de sorte que vous ne devrait les utiliser que lorsque vous savez que la valeur d'un symbole ne jamais changer.

Comme nous pouvons le voir, à l'aide de const a ses avantages quand on sait que la valeur d'un symbole ne changera jamais. Il peut effectuer plus rapidement parce que le CLR n'a pas besoin de régler la valeur.

En effet, après la création de la demande de l'assemblée, l'assemblée DLL n'est même pas chargé au moment de l'exécution et peuvent être supprimés à partir du disque parce que le compilateur n'a pas même d'ajouter une référence à la DLL de l'assemblée dans le l'application de métadonnées.

Comme l'a déjà suggéré par @Sergey Berezovskiy, nous pourrions utiliser static readonly si vous avez besoin de la CLR pour régler la valeur dynamiquement à l'exécution. La Performance est affectée à cette solution, mais il y a aussi un autre avantage.

En outre, un champ peut être de tout type de données, de sorte que vous n'avez pas à limitez votre compilateur intégré de types primitifs (comme vous faire pour les constantes).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X