2010-03-25 7 views
21

J'ai hâte de connaître la différence entre une variable const et une variable statique. Pour autant que je sache, un const est aussi statique et ne peut pas être accédé sur une variable d'instance qui est comme statique, alors quelle est la différence entre eux?Quelle est la différence entre Const et Static en C#?

S'il vous plaît expliquer ...

+9

Il n'existe pas de variable const. –

Répondre

29

const Les champs ne peuvent contenir que des types de valeur ou System.String. Ils doivent être immuables et résolvables à la compilation.

static readonly Les champs peuvent généralement contenir des types de référence, qui (autres que les chaînes) peuvent uniquement être créés au moment de l'exécution. Ceux-ci peuvent (mais ne devraient pas) être mutables; la seule chose qui ne peut pas changer est la référence elle-même.

Si vous devez gérer un ensemble "constant" d'instances qui sont des types de référence, vous le faites généralement avec un ensemble de champs public static readonly, tels que les membres de System.Drawing.SystemColors.

Last but not least, l'initialisation d'un champ readonly peut être différée jusqu'à ce que l'exécution d'un constructeur, ce qui signifie que, même si elle ne peut être écrit à une fois, il ne faut pas toujours être initialisé avec le exactement la même valeur. Les vraies constantes déclarées avec const peuvent uniquement avoir une seule valeur (spécifiée lors de la compilation).

+1

De plus, un readonly statique peut être modifié dans un constructeur, de sorte que différents constructeurs peuvent fournir des valeurs différentes pour le champ static readonly. –

+0

@Jeff: Je ne suis pas Joel. : P – Aaronaught

2

A (non-lecture seule) statique peut être modifiée après qu'il a été déclaré alors qu'une constante ne peut pas. De plus, une constante ne peut pas être définie à l'aide d'une fonction, contrairement à une variable statique.

6

Comme vous le dites, à la fois statique et const sont attachés à un type plutôt que d'un exemple d'un type. Cependant, vous pouvez toujours modifier les éléments statiques. Vous ne pouvez pas modifier les éléments const.

Soyez prudent avec cela, cependant. Si votre élément const est un type de référence, l'expression affectée doit être évaluée au moment de la compilation, ce qui signifie que la seule valeur possible que vous pouvez donner à la référence est null (avec l'exception notable et utile des chaînes).

+0

Cela ne semble pas correct. Statique est également valide sur un champ. Et le seul type de référence const possible est une chaîne. Vous ne pouvez pas changer de chaîne. –

+0

A noter également que les deux seuls types de références qu'un const peut contenir est string et null –

+0

Cela m'a semblé faux aussi, juste après l'avoir écrit. Donc je suis allé et vérifié - vous pouvez avoir un const de types de référence. Je savais que c'était possible. Mais sauf pour les chaînes quand vous le faites, il doit être nul. Mise à jour de ma réponse pour refléter cela. –

11

Une différence subtile mais cruciale est que consts sont évalués au moment de la compilation, tandis que statics sont évalués au moment de l'exécution. Cela a un impact important sur le versionnement. Par exemple, supposons que vous écrivez:

public const int MaxValue = 100; 

Vous compilez et expédiez votre assembly (Assembly A). Ensuite, quelqu'un d'autre écrit un assembly (Assembly B) qui référence MaxValue. Dans ce cas, la valeur 100 est compilée dans leur assemblage ainsi que le vôtre.

Si vous aviez écrit ceci:

public static readonly int MaxValue = 100; 

alors la référence dans leur assemblée resterait juste que, une référence. Lorsque quelqu'un exécutait l'assembly B, la valeur 100 était chargée à partir de votre assembly, Assembly A.

Cela peut, par exemple, affecter des scénarios de correction simples.Si vous émettez un Assembly A mis à jour où MaxValues ​​est déclaré comme 200, et que l'utilisateur copie cette version sur la version précédente (mais ne recompile pas l'Assembly B), alors dans le premier scénario, l'Assembly B continuera à fonctionner comme si MaxValues ​​étaient 100, car c'est la valeur const qui a été compilée dans l'assembly B. Dans le second scénario, l'assembly B récupère la nouvelle valeur car elle charge la variable static non const au moment de l'exécution.

0

Une constante est une variable qui ne peut pas être modifiée en valeur. Une variable statique ne peut pas être utilisée en dehors de la portée de sa déclaration. Autrement dit, si c'est une variable globale, elle ne peut être utilisée que dans le fichier qui la déclare. S'il s'agit d'une variable à l'intérieur d'une fonction, elle ne peut être utilisée qu'à l'intérieur de cette fonction.

Questions connexes