En C #, suis-je encouragé à utiliser le mot clé var polyvalent pour chaque déclaration de variable? Si oui, dois-je mentionner ces caractères spéciaux pour les valeurs littérales dans la déclaration de variable comme le M pour décimal dans l'instruction suivante:
var myDecimal = 14.5M;
Si cela fait une différence, j'essaie de faire du développement web avec C #.
Il y a eu beaucoup de différends sur l'utilisation de var. Mes règles générales sont les suivantes.
Fondamentalement, l'objectif est de faciliter la lecture du code. Si vous pensez que var suffit car l'affectation est évidente, utilisez var. Utilisez le nom de type complet comme indice pour le lecteur lorsque vous le jugez nécessaire.
Quand utiliser var
est une programmation "guerre sainte". Il y a précisément un endroit où cela est nécessaire: lorsque le résultat d'une opération crée un type anonyme, tel que:
var result = new { Name = "John", Age = 35 };
Partout ailleurs, il est facultatif et correspond vraiment à votre norme de codage pour l'utiliser ou non dans les autres situations.
Et oui, vous aurez besoin des caractères spéciaux pour les littéraux pour que le compilateur sache ce que c'est sur le côté droit. Dans votre exemple, sans M
, la valeur par défaut est double
plutôt que decimal
.
Cependant, l'utilisation de var a au moins le potentiel de rendre votre code plus difficile à comprendre pour les autres développeurs. Pour cette raison, la documentation C # utilise généralement var uniquement lorsque cela est nécessaire.
Je n'aime vraiment pas vraiment la frappe implicite. En surface, cela tend à rendre le code plus lisible, mais peut entraîner de nombreux problèmes sur la route. Si un dev change un initialiseur de variable, disons, de
var myFloat=100f;
à
var myFloat=100;
ou
var myFloat=100.0;
Le type changera, entraînant toute une série d'erreurs du compilateur ou, s'il se trouve dans une vue Web et que vous n'utilisez pas l'étape de post-construction pour précompiler vos vues, toute une série d'erreurs d'exécution qui ne seront pas détectées sans effet tests de pré-déploiement.
La frappe implicite ne fonctionne pas non plus partout (à partir du même lien MSDN)
var ne peut être utilisé que lorsqu'une variable locale est déclarée et initialisée dans la même instruction; la variable ne peut pas être initialisée à null, ni à un groupe de méthodes ou à une fonction anonyme.
var ne peut pas être utilisé sur des champs à portée de classe.
Les variables déclarées à l'aide de var ne peuvent pas être utilisées dans l'expression d'initialisation. En d'autres termes, cette expression est légale: int i = (i = 20); mais cette expression produit une erreur au moment de la compilation: var i = (i = 20);
Plusieurs variables implicitement typées ne peuvent pas être initialisées dans la même instruction.
Si un type nommé var est dans la portée, le mot clé var se résoudra en ce nom de type et ne sera pas traité comme faisant partie d'une déclaration de variable locale implicitement typée.
Garder votre code cohérent (dans ce cas, utiliser une frappe explicite partout) est une très, très bonne chose. À mon avis, var
est paresseux et n'offre aucun avantage réel, et introduit encore un autre point de défaillance potentiel dans un processus déjà complexe.
Mise à jour 2017
J'ai complètement changé d'avis. Lorsque je travaille en C #, j'utilise var
la plupart du temps (à l'exception de choses comme les variables de type interface et autres). Il garde le code concis, ce qui améliore la lisibilité. Cependant, faites attention à ce qu'est vraiment le type résolu.
La référence C # montre ce qui suit pour illustrer une bonne ou une mauvaise utilisation de cette construction:
L'exemple suivant montre deux expressions de requête. Dans la première expression, l'utilisation de var est autorisée mais n'est pas requise, car le type du résultat de la requête peut être indiqué explicitement sous la forme d'un IEnumerable. Cependant, dans la deuxième expression, var doit être utilisé car le résultat est une collection de types anonymes et le nom de ce type n'est accessible qu'au compilateur lui-même. Notez que dans l'exemple # 2, l'élément de variable d'itération foreach doit également être implicitement tapé.
// Example #1: var is optional because
// the select clause specifies a string
string[] words = { "Apple", "strawberry", "grape", "Peach", "banana" };
var wordQuery = from Word in words
where Word[0] == 'g'
select Word;
// Because each element in the sequence is a string,
// not an anonymous type, var is optional here also.
foreach (string s in wordQuery)
{
Console.WriteLine(s);
}
// Example #2: var is required because
// the select clause specifies an anonymous type
var custQuery = from cust in customers
where cust.City == "Phoenix"
select new { cust.Name, cust.Phone };
// var must be used because each item
// in the sequence is an anonymous type
foreach (var item in custQuery)
{
Console.WriteLine("Name={0}, Phone={1}", item.Name, item.Phone);
}
Le mot clé var demande uniquement au compilateur de déduire automatiquement le type de la variable de type var. Par conséquent, si vous souhaitez stocker une variable de type décimal dans une variable var, vous devez utiliser le m. De même, si vous stockez une chaîne, vous devez la mettre entre guillemets.
Pour moi, je n'utilise pas var dans les cas suivants:
Fruit foo = new Apple();
. Dans ce cas, je pense que var est à éviter et utiliser la classe parent (ici Fruit) est mieux en permettant une meilleure compréhension de la logique du code et une limitation des bugs probables (Avec var, pas de vérification du concept polymorphe!)Pour le reste, je pense que cela dépend du cas et de la formation du développeur. Certaines personnes du monde PHP préféreront ne pas prendre soin des types de variables, et certaines personnes du monde Java penseront simplement que var est une hérésie et plus il est verbeux, mieux c'est.
Vous devrez vous faire une opinion personnelle :)