Quelle est la différence entre Const et Static en C #?

Je suis impatient 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 consulté sur une variable d’instance identique à statique, quelle est la différence entre elles?

S’il vous plaît, expliquez …

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

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

Si vous devez conserver 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 .

Enfin, l’initialisation d’un champ en readonly peut être différée jusqu’à l’exécution d’un constructeur, ce qui signifie que même s’il ne peut être écrit qu’une seule fois, il ne doit pas toujours être initialisé avec exactement la même valeur. Les constantes vraies déclarées avec const ne peuvent avoir qu’une seule valeur (spécifiée lors de la compilation).

Une différence subtile mais cruciale réside dans le fait que les consts sont évaluées au moment de la compilation, tandis que la statics est évaluée au moment de l’exécution. Cela a un impact important sur la gestion des versions. Par exemple, supposons que vous écriviez:

 public const int MaxValue = 100; 

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

Si vous aviez écrit ceci:

 public static readonly int MaxValue = 100; 

alors la référence dans leur assemblée restrait juste cela, une référence. Lorsque quelqu’un exécutait Assembly B, la valeur 100 serait chargée à partir de votre assembly, Assembly A.

Cela peut, par exemple, affecter de simples scénarios de correctifs. Si vous émettez un Assembly A mis à jour dans lequel MaxValues ​​est déclaré 200 et que l’utilisateur copie cette version par rapport à la version précédente (sans recomstackr Assembly B), dans le premier scénario, Assembly B continuera à fonctionner comme si MaxValues ​​était à 100, parce que c’est la valeur const qui a été compilée dans Assembly B. Dans le deuxième scénario, Assembly B prendra la nouvelle valeur car il charge la variable static non const au moment de l’exécution.

Comme vous le dites, stat et const sont liés à un type plutôt qu’à une instance de 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).

Une statique (non en lecture seule) peut être modifiée après sa déclaration, alors qu’une constante ne le peut pas. De plus, une constante ne peut pas être définie à l’aide d’une fonction alors qu’une variable statique le peut.

Une constante est une variable dont la valeur ne peut pas être changée.

Une statique est une variable qui ne peut pas être utilisée en dehors de la scope de sa déclaration. En d’autres termes, s’il s’agit d’une variable globale, elle ne peut être utilisée que dans le fichier qui la déclare. S’il s’agit d’une variable dans une fonction, elle ne peut être utilisée que dans cette fonction.