2010-11-18 9 views
3

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

+0

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. –

+1

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?" :-) –

+0

duplication possible de [Utilisation du mot-clé var en C#] (http://stackoverflow.com/questions/41479/use-of-var-keyword-in-c-sharp) – nawfal

Répondre

3

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(); 
+1

Attention à l'échange de code existant avec var, il peut revenir et vous mordre. Considérez ceci: var list = new Liste (); list.Reverse(); --- puis --- IList list = new Liste (); list.Reverse(); Les deux exemples se compilent bien, mais seul le premier exemple va inverser le contenu de la liste. Dans le deuxième exemple, le compilateur utilisera la méthode d'extension Reverse() sur IEnumerable et son immuable, ce qui signifie qu'il renvoie une liste inversée, tandis que le premier exemple modifie la liste. –

+1

Ou dans l'autre sens: IList list = new Liste (); list.Reverse(). FirstOrDefault(); --- et ensuite --- var list = new Liste (); list.Reverse(). FirstOrDefault(); Ici, dans le deuxième exemple, le compilateur échouera puisque la var infère dans la classe concrète List, qui a déjà une méthode Reverse(), alors qu'elle utilisera la méthode d'extension sur le premier exemple. Donc var peut aussi être un peu difficile. –

5

types Annonymous:

var person = new { Name = "John", Surname = "Doe" }; 
2

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.

1

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).

1

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>(); 
+0

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 ); –

+0

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 ... –

0

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!)

1

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 
} 
+0

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 à chacune d'entre elles. –

0

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.

+0

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. –

+0

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

Questions connexes