Question

    

Cette question a déjà une réponse ici:

         

Je viens d'installer une version d'évaluation de ReSharper et l'une des premières choses que j'ai remarqué est qu’il suggère toujours de remplacer les variables locales explicitement typées par des variables implicitement typées, par exemple:

public string SomeMethod(int aParam)
{
    int aNumber = SomeOtherMethod(aParam);
    // should be changed to:
    var aNumber = SomeOtherMethod(aParam);
}

Je pense que les variables explicitement typées sont plus lisibles (plus explicites).

Que pensez-vous de la suggestion de ReSharper? L'utilisation de variables implicitement typées présente-t-elle un avantage? Quand utilisez-vous des vars implicites / explicites?

Était-ce utile?

La solution

Personnellement, je n’utilise que & # 8220; var & # 8221; quand je peux clairement distinguer la variable Type en lisant simplement la déclaration, par exemple:

var someVariable = new List<int>();

Dans l'exemple ci-dessus, il est évident que & # 8220; var & # 8221; fait référence à & # 8220; Liste < int > & # 8221;.

Je ne aime pas utiliser & # 8217; & # 8220; var & # 8221; quand je dois aller à une définition de méthode pour savoir quel type de variable & # 8220; var & # 8221; représente ou doit avoir recours à visual studio intelli-popup ou à ce que l'on appelle, par exemple, cela ne me convient pas:

var someVaraible = SomeMethod();

Je veux dire, quel est le & # 8220; SomeMethod & # 8221; fonction censée revenir? Pouvez-vous dire simplement en regardant la ligne de code? Non, vous ne pouvez pas & # 8217; t, c’est pourquoi j’évite d’utiliser & # 8220; var & # 8221; sur ces situations.

Autres conseils

Il y a beaucoup de discussions à ce sujet, mais je pense que tout se résume à un goût personnel, comme si vous utilisiez le mot clé 'this' presque partout.

Je personnellement préfère les variables typées de manière explicite, mais lorsque vous utilisez des collections génériques imbriquées, les choses peuvent devenir plus lisibles à l'aide d'une variable implicitement typée. Regardez:

Dictionary<string, Dictionary<string, string>> myDictionary = new Dictionary<string, Dictionary<string, string>>();

vs:

var myDictionary = new Dictionary<string, Dictionary<string, string>>();

EDIT: cette rubrique SO traite de la même question, avec quelques réponses intéressantes: À utiliser: type de nom var ou d'objet?

EDIT2: De nos jours, en travaillant beaucoup avec async, j’aperçois que l’utilisation de variables de type explicite peut parfois empêcher les bogues méchants. Considérez cet exemple stupide où vous voudriez renvoyer l'identifiant d'un utilisateur. Considérez également que GetUserAsync renvoie un Task<User>. Si vous utilisez des variables implicitement typées, vous utiliserez quelque chose comme ceci:

public long GetUserId()
{
  var user = GetUserAsync();
  return user.Id;
}

Ceci compile, mais c'est faux. "utilisateur" est en fait un Task. Et il compile en tant que Id possède également une propriété await. Dans ce cas, on renverrait accidentellement l'id d'une tâche à la place de l'utilisateur.

public long GetUserId()
{
  User user = GetUserAsync();
  return user.Id;
}

Ce qui précède ne compile pas car le compilateur se plaint de l'impossibilité de lancer une tâche vers un utilisateur. Ajouter le <=> mot clé, bien sûr, résout ce problème.

En fait, cela m'est arrivé une fois: -)

Juste au cas où certains n'auraient pas remarqué & # 8217; vous pouvez facilement changer les & # 8220; suggestions & # 8221; in Reshaper (Reshaper - > Options - > Langues - > Actions de contexte - > & # 8220; Remplacez la spécification de type explicite par & # 8216; var & # 8217; & # 8221;).

Personnellement, je préfère avoir des spécifications de type explicites partout, mais je ne suis pas trop difficile à ce sujet.

Il est simplement plus facile de saisir le pseudo-mot-clé var parfois qu'un nom de type énorme, en particulier si un générique peut être impliqué. Cependant, vous devez savoir qu'ils sont fonctionnellement identiques. Il n'y a pas de différence de performance ou quoi que ce soit. Le compilateur dérive le type du côté droit de l'affectation et remplace var avec ce type. Cela ne se produit pas au moment de l'exécution comme une variante VB.

FWIW, le mot-clé var est clairement lisible dans de nombreux cas. Surtout si ...

  1. Le côté droit de l'affectation est une expression du constructeur.

    var map = nouveau dictionnaire > ();

  2. Les variables locales ont de bons noms.

HTH

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top