Variables locales implicitement typées (Guide de programmation C#)
Les variables locales peuvent être déclarées sans donner de type explicite. Le mot clé var
indique au compilateur de déduire le type de la variable à partir de l’expression située à droite de l’instruction d’initialisation. Le type déduit peut être un type intégré, un type anonyme, un type défini par l’utilisateur ou un type défini dans la bibliothèque de classes .NET. Pour plus d’informations sur l’initialisation des tableaux avec var
, consultez Tableaux implicitement typés.
Les exemples suivants montrent différentes manières de déclarer des variables locales avec var
:
// i is compiled as an int
var i = 5;
// s is compiled as a string
var s = "Hello";
// a is compiled as int[]
var a = new[] { 0, 1, 2 };
// expr is compiled as IEnumerable<Customer>
// or perhaps IQueryable<Customer>
var expr =
from c in customers
where c.City == "London"
select c;
// anon is compiled as an anonymous type
var anon = new { Name = "Terry", Age = 34 };
// list is compiled as List<int>
var list = new List<int>();
Il est important de comprendre que le mot clé var
n’est pas « variant » et qu’il n’indique pas que la variable est peu typée ou à liaison tardive. Cela signifie simplement que le compilateur détermine et assigne le type qui convient le mieux.
Le mot clé var
peut être utilisé dans les contextes suivants :
Dans des variables locales (variables déclarées dans la portée de la méthode), comme indiqué dans l’exemple précédent.
Dans une instruction d’initialisation for
for (var x = 1; x < 10; x++)
Dans une instruction d’initialisation foreach
foreach (var item in list) {...}
Dans une instruction using
using (var file = new StreamReader("C:\\myfile.txt")) {...}
Pour plus d’informations, consultez Guide pratique pour utiliser des tableaux et des variables locales implicitement typés dans une expression de requête.
Types var et anonymes
Dans de nombreux cas, l’utilisation de var
est facultative et sert uniquement à simplifier la syntaxe. Toutefois, lorsqu’une variable est initialisée avec un type anonyme, vous devez déclarer la variable en tant que var
si vous savez déjà que vous aurez besoin d’accéder aux propriétés de l’objet. Il s’agit d’un scénario courant avec les expressions de requête LINQ. Pour plus d’informations, consultez Types anonymes.
Du point de vue de votre code source, un type anonyme n’a pas de nom. Par conséquent, si une variable de requête a été initialisée avec var
, la seule façon d’accéder aux propriétés de la séquence d’objets retournée consiste à utiliser var
comme type pour la variable d’itération de l’instruction foreach
.
class ImplicitlyTypedLocals2
{
static void Main()
{
string[] words = { "aPPLE", "BlUeBeRrY", "cHeRry" };
// If a query produces a sequence of anonymous types,
// then use var in the foreach statement to access the properties.
var upperLowerWords =
from w in words
select new { Upper = w.ToUpper(), Lower = w.ToLower() };
// Execute the query
foreach (var ul in upperLowerWords)
{
Console.WriteLine("Uppercase: {0}, Lowercase: {1}", ul.Upper, ul.Lower);
}
}
}
/* Outputs:
Uppercase: APPLE, Lowercase: apple
Uppercase: BLUEBERRY, Lowercase: blueberry
Uppercase: CHERRY, Lowercase: cherry
*/
Remarques
Les restrictions suivantes s’appliquent aux déclarations de variables implicitement typées :
var
peut être utilisé uniquement lorsqu’une variable locale est déclarée et initialisée dans la même instruction. La variable ne peut pas être initialisée vers la valeur Null, vers un groupe de méthodes ou vers une fonction anonyme.var
ne peut pas être utilisé dans les champs situés dans la portée de la 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, l’expressionint i = (i = 20);
est légale, mais l’expression génère une erreur de compilation :var i = (i = 20);
Il n’est pas possible d’initialiser plusieurs variables implicitement typées dans la même instruction.
Si un type nommé
var
se trouve dans la portée, le mot clévar
est résolu en ce nom de type et n’est pas considéré comme faisant partie d’une déclaration de variable locale implicitement typée.
Le typage implicite avec le mot clé var
ne peut être appliqué qu’aux variables comprises dans la portée de la méthode locale. Le typage implicite n’est pas disponible pour les champs de classe, car le compilateur C# rencontrerait un paradoxe logique pendant le traitement du code : le compilateur a besoin de connaître le type du champ, mais il ne peut pas déterminer le type tant que l’expression d’assignation n’est pas analysée, et l’expression ne peut pas être évaluée sans connaître le type. Prenez le code suivant :
private var bookTitles;
bookTitles
est un champ de classe de type var
. Le champ n’ayant aucune expression à évaluer, le compilateur ne peut pas déduire le type que bookTitles
est censé avoir. De plus, l’ajout d’une expression au champ (comme vous le feriez pour une variable locale) est également insuffisant :
private var bookTitles = new List<string>();
Quand le compilateur rencontre des champs pendant la compilation du code, il enregistre le type de chaque champ avant de traiter toutes les expressions associées. Le compilateur rencontre le même paradoxe en essayant d’analyser bookTitles
: il doit connaître le type du champ, mais il détermine normalement le type de var
en analysant l’expression, ce qui est impossible sans connaître le type au préalable.
var
peut également être utile avec les expressions de requête dans lesquelles il est difficile de déterminer le type construit exact de la variable de requête. Cela peut se produire avec les opérations de regroupement et de classement.
Le mot clé var
peut également être utile lorsque le type de la variable est fastidieux à taper, ou bien lorsqu’il est évident ou lorsqu’il n’aide pas à la lisibilité du code. Par exemple, var
est utile avec les types génériques imbriqués tels que ceux utilisés avec les opérations de groupe. Dans la requête suivante, le type de la variable de requête est IEnumerable<IGrouping<string, Student>>
. Tant que les personnes qui doivent gérer votre code comprennent ceci, le typage implicite peut tout à fait être utilisé pour rendre votre code plus concis et simplifier sa gestion.
// Same as previous example except we use the entire last name as a key.
// Query variable is an IEnumerable<IGrouping<string, Student>>
var studentQuery3 =
from student in students
group student by student.Last;
L’utilisation de var
permet de simplifier votre code, mais son utilisation doit être limitée aux cas où il est nécessaire ou lorsqu’il rend votre code plus facile à lire. Pour plus d’informations sur le moment où utiliser var
correctement, consultez la section Variables locales typées implicitement dans l’article Instructions de codage C#.