87 votes

Avantages d'utiliser const au lieu de variables dans les méthodes

A chaque fois que je les variables locales à une méthode, ReSharper suggère de les convertir en des constantes:

// instead of this:
var s = "some string";
var flags = BindingFlags.Public | BindingFlags.Instance;

// ReSharper suggest to use this:
const string s = "some string";
const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;

Étant donné que ce sont vraiment des valeurs constantes (et pas variables) je comprends que ReSharper suggèrent de les changer à const.

Mais en dehors de cela, est-il un autre avantage lors de l'utilisation de const (par exemple de meilleures performances) qui justifient l'utilisation d' const BindingFlags à la place de la pratique et lisible var mot-clé?

BTW: je viens de trouver une question similaire ici: Resharper toujours suggérant de me faire const string au lieu de string., mais je pense que c'est plus sur les champs d'une classe où ma question porte sur la variable locale/consts.

92voto

landoncz Points 887

Le compilateur génère une erreur si vous essayez d'attribuer une valeur à une constante, donc peut-être vous empêche de changer accidentellement il.

Aussi, généralement, il y a un petit gain de performance à l'aide de constantes vs variables. Cela a à voir avec la façon dont ils sont compilés dans le MSIL, par ce MSDN magazine Q&A:

Maintenant, partout où myInt est référencé dans le code, au lieu d'avoir à faire un "ldloc.0" pour obtenir la valeur de la variable, le MSIL juste des charges de la valeur de la constante qui est codé en dur dans le MSIL. En tant que tel, il n'y a habituellement un peu de la performance et de la mémoire avantage de l'utilisation de constantes. Toutefois, pour utiliser vous devez avoir la valeur de la variable au moment de la compilation, et toute référence à cette constante au moment de la compilation, même s'ils sont dans une autre assemblée, sera présent à la substitution.

Les constantes sont certainement un outil utile si vous connaissez la valeur au moment de la compilation. Si vous ne le faites pas, mais vous voulez vous assurer que votre variable est définie une seule fois, vous pouvez utiliser le mot clé readonly en C# (qui correspond à initonly dans MSIL) pour indiquer que la valeur de la variable ne peut être réglé que dans le constructeur; après, c'est une erreur de le changer. Cette fonction est souvent utilisée lorsqu'un champ permet de déterminer l'identité d'une classe, et est souvent égal à un paramètre du constructeur.

15voto

YetAnotherUser Points 3823

Selon ma compréhension, les valeurs de Const n’existent pas au moment de l’exécution - c’est-à-dire sous la forme d’une variable stockée dans un emplacement de la mémoire - sont incorporées dans le code MSIL au moment de la compilation. Et aurait donc un impact sur les performances. Plus de temps d'exécution ne serait pas nécessaire pour effectuer des tâches de maintenance (contrôles de conversion / nettoyage des ordures, etc.) également, même si les variables requièrent ces contrôles.

4voto

BrokenGlass Points 91618

const est une constante de temps de compilation - cela signifie que tout votre code qui utilise la variable const est compilé pour contenir l'expression constante que contient la variable const - le IL émis contiendra cette valeur constante elle-même.

Cela signifie que l'encombrement de la mémoire est plus petit pour votre méthode car la constante ne nécessite aucune mémoire pour être allouée au moment de l'exécution.

4voto

Shrage Smilowitz Points 2877

Outre la petite amélioration des performances, lorsque vous déclarez une constante, vous appliquez explicitement deux règles à vous-même et aux autres développeurs qui utiliseront votre code.

  1. Je dois l'initialiser avec une valeur pour le moment, je ne peux pas le faire ailleurs.
  2. Je ne peux pas changer sa valeur n'importe où.

En code, tout est question de lisibilité et de communication.

2voto

Rob P. Points 7292

Une valeur const est également 'partagée' entre toutes les instances d'un objet. Cela pourrait également entraîner une faible utilisation de la mémoire.

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