Je n'ai pas l'habitude d'utiliser Var variable implicitement typée. Tout le monde peut me faire savoir l'avantage d'utiliser une telle variable?Tout avantage à utiliser implicitement type var
Répondre
Une chose est qu'il est un raccourci pour les types longs ... Tels que:
List<Dictionary<string, object>> myList = getList();
peut être simplifié à:
var myList = getList();
Attention à l'échange de code existant avec var, il peut revenir et vous mordre. Considérez ceci: var list = new Liste
Ou dans l'autre sens: IList
types Annonymous:
var person = new { Name = "John", Surname = "Doe" };
En utilisation normale, 'var' est entièrement optionnel et équivaut à spécifier manuellement le type. Voir here.
Cependant, le mot-clé 'var' est nécessaire pour anonymous types, que j'ai normalement utilisé conjointement avec LINQ.
Je trouve précisément beaucoup plus facile à lire ceci:
foreach(var dbitem in context.usp_GetUserAndAccountData())
{
txtUserName.Text = dbitem.UserName;
// ...
}
que ceci:
foreach(ISingleResult<usp_GetUserAndAccountDataResult> dbitem in context.usp_GetUserAndAccountData())
{
txtUserName.Text = dbitem.UserName;
// ...
}
Pour moi, peu importe ce que je définis explicitement dbitem
, je vais faire encore les mêmes actions ; donc var
ici est inestimable!
Et la beauté de tout cela est qu'IntelliSense vous énumérera toujours tous les membres du type attendu à l'autre extrémité (tel que UserName
dans mon exemple).
Meilleure lisibilité du code. Surtout utilisé avec les constructeurs et à long nom du type:
var anArray = new String[3];
var iStream = new InputStream(...);
var dict = new Dictionary<string, int>();
Et même pour les variables qui doivent être initialisées comme des valeurs nulles, vous pouvez utiliser le mot-clé var comme ceci: var dict = default (Dictionary
L'idée de lisibilité dépend. Dans votre exemple ci-dessus, c'est vrai. C'est plus lisible. Cependant, dans une situation où vous appelez une fonction dans laquelle l'interface de retour ou le type n'est pas clair, il peut être difficile de savoir - sans revoir la méthode en question - de quel type vous avez affaire et par conséquent, argumenter que c'est moins accessible. Pas une raison de ne pas utiliser var mais je ne l'utilise pas car il est lisible seul ... –
Je crois qu'il a été créé dans le but de types anonymes (ala exemple kugels):
var person = new { Name = "John", Surname = "Doe" };
Cependant, depuis je l'ai découvert je dois admettre Je l'ai trouvé très utile en cours d'utilisation au jour le jour où traiter les noms de type plus, par exemple:
var aaa = new Dictionary<string, List<ReallyLongTypeName>>();
// vs
Dictionary<string, List<ReallyLongTypeName>> aaa = new Dictionary<string, List<ReallyLongTypeName>>();
Un autre effet secondaire est que les noms de type peuvent changer (ou être remplacés par d'autres t ypes), mais le code qui utilise var
ne cassera pas », par exemple:
var item = this.GetItem();
this.Name = item.Name;
this.Age = item.Age;
Tant que la valeur de retour de GetItem a toujours une propriété Name
et une propriété Age
(qui sont compatibles avec les propriétés sur this
) puis GetItems
peut retourner un objet entièrement différent et le code ci-dessus sera toujours compiler. (Mais attention, les assemblages compilés existants ne peuvent pas utiliser la même astuce!)
Sachez que l'utilisation de var n'est pas toujours ce qu'elle semble être (mais c'est surtout le cas).Un exemple est le suivant:
datalist est un contrôle DataList sur un formulaire en ligne
foreach (var item in dataList.Items)
{
// item is of type System.Object
}
foreach (DataListItem item in dataList.Items)
{
// item is of type DataListItem
}
C'est juste à cause du monde pre. Net 2 avant que les génériques n'existent, et pas une limitation du mot-clé var.Je serais ravi de voir MS revisiter toutes ces collections et ajouter une interface IEnumerable
Outre les autres réponses, à moi un réel avantage est en matière de code externe, pour découpler le type de variable la signature de la méthode réelle.
Tenir compte de cette interface:
public interface IFoo
{
List<Foo> GetSomething();
}
Et que vous avez deux lignes de code:
List<Foo> foos = fooRepo.GetSomething();
var foos2 = fooRepo.GetSomething();
Même résultat pour au-dessus de deux lignes. (List<Foo>
retourné).
Maintenant, si changé l'interface:
public interface IFoo
{
Dictionary<bool,Foo> GetSomething();
}
La première ligne serait maintenant lancer une erreur de compilation, le second ne serait pas:
List<Foo> foos = fooRepo.GetSomething(); // error - can't convert from Dictionary<bool,Foo> to List<Foo>
var foos2 = fooRepo.GetSomething(); // works!
Ceci est très pratique lorsque vous travaillez avec les dépôts/autres projets où les contrats d'interface/les signatures de méthodes peuvent changer.
Oui, vous devez encore recompiler les classes, mais vous ne devez pas revenir en arrière et modifier tout le code qui référencé l'ancien type de retour.
Si une bibliothèque externe change de signature, vous devrez quand même recompiler toutes vos bibliothèques, puisque la var est traduite en un type concret à la compilation, ce qui ne correspondrait plus. Je suis toujours d'accord qu'une simple recompilation sans aucun changement de code est sympa, mais juste pour le rendre clair car on pourrait avoir l'impression que var travaille au niveau de l'exécution en lisant votre dernière ligne. –
Oui - @BurningIce, excellent point. Oui, vous devez recompiler - le point que je faisais était que vous n'avez pas besoin de revenir en arrière et de changer tout le code. – RPM1984
- 1. Form Helper: Tout autre avantage?
- 2. Pourquoi utiliser var comme variable de type
- 3. var Utiliser ou ne pas utiliser var
- 4. Que utiliser: var ou type de nom d'objet?
- 5. Impossible de convertir implicitement le type ... à ... problème
- 6. Impossible de convertir implicitement le type
- 7. Impossible de convertir implicitement le type « System.Web.HttpPostedFile » à « System.Web.HttpPostedFileBase »
- 8. Impossible de convertir implicitement le type « System.Collections.Generic.List » à « System.Collections.Generic.List
- 9. C# retour au type var?
- 10. différence var et Type. Pourquoi doesnt travail Var ici?
- 11. Question sur le type de var
- 12. En objectif-C, quelle est la différence entre Type * var et Type * var?
- 13. Pourquoi devrais-je utiliser des variables locales implicitement typées?
- 14. tableau Implicitement typé de triplés
- 15. Comment savoir si le type A est implicitement convertible en type B
- 16. Rechercher un type attribué à un « var » dans Visual Studio
- 17. unix DECLARE_WAIT_QUEUE_HEAD (var) var prototype?
- 18. Impossible de convertir implicitement type chaîne de caractères à string [] dans la méthode autocomplete
- 19. Utilisation du type Int et de la contrainte Integral. Avantage?
- 20. Erreur: impossible de convertir implicitement le type 'void' en 'System.Collections.Generic.List'
- 21. Comment convertir la chaîne à tout type
- 22. C# Impossible de convertir implicitement le type 'string' en 'System.IO.StreamReader
- 23. LINQ: ne peut pas convertir implicitement le type « System.Collections.Generic.IEnumerable <int> » à « int »
- 24. C# ne peut pas convertir implicitement le type T de type T
- 25. Avantage Data Access Layer
- 26. Comment utiliser var constant dans SSIS
- 27. Rendre "ceci" implicitement dynamique
- 28. dynamique vs var
- 29. Comment utiliser implicitement une cible pour générer un fichier inclus?
- 30. Tsql VarChar implicitement SmallDateTime
Bien que techniquement, vous posiez un type de question différent, veuillez consulter [any] (http://stackoverflow.com/search?q= [C% 23] + var) des autres questions et réponses relatives au mot-clé 'var'. Votre question pourrait être considérée comme un doublon de [this] (http://stackoverflow.com/questions/1430831/anyone-found-a-use-of-var-other-than-for-linq) one. –
Je me demande si vous obtiendriez des réponses différentes en remplaçant le biais dans le titre par "Tout avantage à épeler explicitement les types?" :-) –
duplication possible de [Utilisation du mot-clé var en C#] (http://stackoverflow.com/questions/41479/use-of-var-keyword-in-c-sharp) – nawfal