Expressions (Guide de programmation C#)Expressions (C# Programming Guide)

Une expression est une séquence d’un ou plusieurs opérandes et de zéro, un ou plusieurs opérateurs qui peuvent être évalués à une valeur, un objet, une méthode ou un espace de noms unique.An expression is a sequence of one or more operands and zero or more operators that can be evaluated to a single value, object, method, or namespace. Elle peut être constituée d’une valeur littérale, d’un appel de méthode, d’un opérateur et de ses opérandes, ou d’un nom simple.Expressions can consist of a literal value, a method invocation, an operator and its operands, or a simple name. Un nom simple peut être le nom d'une variable, d'un membre de type, d'un paramètre de méthode, d'un espace de noms ou d'un type.Simple names can be the name of a variable, type member, method parameter, namespace or type.

Les expressions peuvent utiliser des opérateurs qui à leur tour utilisent d’autres expressions en tant que paramètres, ou des appels de méthode dont les paramètres sont à leur tour d’autres appels de méthode. Leur complexité est donc très variable.Expressions can use operators that in turn use other expressions as parameters, or method calls whose parameters are in turn other method calls, so expressions can range from simple to very complex. Voici deux exemples d’expressions :Following are two examples of expressions:

((x < 10) && ( x > 5)) || ((x > 20) && (x < 25));
   
System.Convert.ToInt32("35");  

Valeurs d’expressionsExpression values

Dans la plupart des contextes dans lesquels les expressions sont utilisées, par exemple dans les instructions ou les paramètres de méthode, l’expression est supposée correspondre à une valeur.In most of the contexts in which expressions are used, for example in statements or method parameters, the expression is expected to evaluate to some value. Si x et y sont des entiers, l’expression x + y correspond à une valeur numérique.If x and y are integers, the expression x + y evaluates to a numeric value. L’expression new MyClass() correspond à une référence à une nouvelle instance d’une classe MyClass.The expression new MyClass() evaluates to a reference to a new instance of a MyClass class. L’expression myClass.ToString() correspond à une chaîne, car c’est le type de retour de la méthode.The expression myClass.ToString() evaluates to a string because that is the return type of the method. Toutefois, même si un espace de noms est considéré comme une expression, il ne correspond pas à une valeur et ne peut donc jamais être le résultat final d’une expression.However, although a namespace name is classified as an expression, it does not evaluate to a value and therefore can never be the final result of any expression. Vous ne pouvez pas passer un nom d’espace de noms à un paramètre de méthode, ni l’utiliser dans une nouvelle expression ou l’affecter à une variable.You cannot pass a namespace name to a method parameter, or use it in a new expression, or assign it to a variable. Vous pouvez l’utiliser uniquement en tant que sous-expression dans une expression plus longue.You can only use it as a sub-expression in a larger expression. Il en va de même pour les types (par opposition aux objets System.Type), aux noms de groupes de méthodes (par opposition aux méthodes spécifiques) et aux accesseurs d’événements add et remove.The same is true for types (as distinct from System.Type objects), method group names (as distinct from specific methods), and event add and remove accessors.

Chaque valeur possède un type associé.Every value has an associated type. Par exemple, si x et y sont toutes deux des variables de type int, la valeur de l’expression x + y est également de type int.For example, if x and y are both variables of type int, the value of the expression x + y is also typed as int. Si la valeur est assignée à une variable d’un type différent, ou si x et y sont des types différents, les règles de conversion de type sont appliquées.If the value is assigned to a variable of a different type, or if x and y are different types, the rules of type conversion are applied. Pour plus d’informations sur le fonctionnement de ces conversions, consultez Cast et conversions de types.For more information about how such conversions work, see Casting and Type Conversions.

Dépassements de capacitéOverflows

Les expressions numériques peuvent provoquer des dépassements de capacité si la valeur est supérieure à la valeur maximale du type de la valeur.Numeric expressions may cause overflows if the value is larger than the maximum value of the value's type. Pour plus d’informations, consultez Checked et Unchecked et Tableau des conversions numériques explicites.For more information, see Checked and Unchecked and Explicit Numeric Conversions Table.

Priorité des opérateurs et associativitéOperator precedence and associativity

Le mode d’évaluation de l’expression est régi par les règles de priorité des opérateurs et d’associativité.The manner in which an expression is evaluated is governed by the rules of associativity and operator precedence. Pour plus d’informations, consultez Opérateurs.For more information, see Operators.

La plupart des expressions, sauf les expressions d’assignation et les expressions d’appel de méthode, doivent être incorporées dans une instruction.Most expressions, except assignment expressions and method invocation expressions, must be embedded in a statement. Pour plus d’informations, consultez Instructions.For more information, see Statements.

Littéraux et noms simplesLiterals and simple names

Les deux types d’expressions les plus simples sont les littéraux et les noms simples.The two simplest types of expressions are literals and simple names. Un littéral est une valeur constante qui n’a aucun nom.A literal is a constant value that has no name. Par exemple, dans l’exemple de code suivant, 5 et "Hello World" sont des valeurs littérales :For example, in the following code example, both 5 and "Hello World" are literal values:

// Expression statements.
int i = 5;
string s = "Hello World";

Pour plus d’informations sur les littéraux, consultez Types.For more information on literals, see Types.

Dans l’exemple précédent, i et s sont des noms simples qui identifient des variables locales.In the preceding example, both i and s are simple names that identify local variables. Quand ces variables sont utilisées dans une expression, le nom de la variable prend la valeur qui est stockée actuellement à l’emplacement de la variable en mémoire.When those variables are used in an expression, the variable name evaluates to the value that is currently stored in the variable's location in memory. Ceci est illustré dans l'exemple suivant :This is shown in the following example:

int num = 5;
System.Console.WriteLine(num); // Output: 5
num = 6;
System.Console.WriteLine(num); // Output: 6            

Appel d’expressionsInvocation expressions

Dans l’exemple de code suivant, l’appel à DoWork est une expression d’appel.In the following code example, the call to DoWork is an invocation expression.

DoWork();  

Un appel de méthode nécessite le nom de la méthode, soit comme nom (comme dans l’exemple précédent), soit comme le résultat d’une autre expression, suivi de parenthèses et des éventuels paramètres de méthode.A method invocation requires the name of the method, either as a name as in the previous example, or as the result of another expression, followed by parenthesis and any method parameters. Pour plus d’informations, consultez Méthodes.For more information, see Methods. Un appel de délégué utilise le nom d’un délégué et des paramètres de méthode entre parenthèses.A delegate invocation uses the name of a delegate and method parameters in parenthesis. Pour plus d’informations, consultez Délégués.For more information, see Delegates. Les appels de méthode et les appels de délégué sont évalués à la valeur de retour de la méthode, si celle-ci retourne une valeur.Method invocations and delegate invocations evaluate to the return value of the method, if the method returns a value. Les méthodes qui retournent void ne peuvent pas être utilisées à la place d’une valeur dans une expression.Methods that return void cannot be used in place of a value in an expression.

Expressions de requêteQuery expressions

Les mêmes règles relatives aux expressions s’appliquent en général aux expressions de requête.The same rules for expressions in general apply to query expressions. Pour plus d’informations, consultez Expressions de requête LINQ.For more information, see LINQ Query Expressions.

Expressions lambdaLambda expressions

Les expressions lambda représentent des « méthodes inline » qui n’ont aucun nom mais qui peuvent avoir des paramètres d’entrée et plusieurs instructions.Lambda expressions represent "inline methods" that have no name but can have input parameters and multiple statements. Elles sont largement utilisées dans LINQ pour passer des arguments aux méthodes.They are used extensively in LINQ to pass arguments to methods. Les expressions lambda sont compilées en délégués ou en arborescences de l’expression en fonction du contexte dans lequel elles sont utilisées.Lambda expressions are compiled to either delegates or expression trees depending on the context in which they are used. Pour plus d’informations, consultez Expressions lambda.For more information, see Lambda Expressions.

Arborescences de l’expressionExpression trees

Les arborescences de l’expression permettent de représenter des expressions en tant que structures de données.Expression trees enable expressions to be represented as data structures. Elles sont largement utilisées par les fournisseurs LINQ pour traduire des expressions de requête en code explicite dans un autre contexte, comme une base de données SQL.They are used extensively by LINQ providers to translate query expressions into code that is meaningful in some other context, such as a SQL database. Pour plus d’informations, consultez Arborescences d’expressions (C#).For more information, see Expression Trees (C#).

Définitions de corps d’expressionExpression body definitions

C# prend en charge les membres expression-bodied, qui vous permettent de fournir une définition de corps d’expression concise pour des méthodes, des constructeurs, des finaliseurs, des propriétés et des indexeurs.C# supports expression-bodied members, which allow you to supply a concise expression body definition for methods, constructors, finalizers, properties, and indexers. Pour plus d’informations, consultez Membres expression-bodied.For more information, see Expression-bodied members.

RemarquesRemarks

Chaque fois qu’un accès à un indexeur d’objet, une variable ou une propriété d’objet est identifié à partir d’une expression, la valeur de cet élément est utilisée comme valeur de l’expression.Whenever a variable, object property, or object indexer access is identified from an expression, the value of that item is used as the value of the expression. Une expression peut être placée n’importe où en C# où une valeur ou un objet est obligatoire, tant que l’expression correspond finalement au type obligatoire.An expression can be placed anywhere in C# where a value or object is required, as long as the expression ultimately evaluates to the required type.

Voir aussiSee also