Membres expression-bodied (Guide de programmation C#)
Les définitions du corps d’expression vous permettent de fournir l’implémentation d’un membre sous une forme lisible et concise. Vous pouvez utiliser une définition de corps d’expression chaque fois que la logique d’un membre pris en charge, comme une méthode ou une propriété, se compose d’une seule expression. La syntaxe générale d’une définition de corps d’expression est la suivante :
member => expression;
où expression est une expression valide.
Les définitions de corps d’expression peuvent être utilisées avec les membres de type suivants :
Méthodes
Une méthode expression-bodied se compose d’une seule expression qui retourne une valeur dont le type correspond au type de retour de la méthode ou, pour les méthodes qui retournent void
, qui effectue une opération. Par exemple, les types qui substituent la méthode ToString incluent généralement une expression unique qui retourne la représentation sous forme de chaîne de l’objet actuel.
L’exemple suivant définit une classe Person
qui substitue la méthode ToString avec une définition de corps d’expression. Il définit également une méthode DisplayName
qui affiche un nom sur la console. Le mot clé return
n’est pas utilisé dans la définition de corps d’expression ToString
.
using System;
namespace ExpressionBodiedMembers;
public class Person
{
public Person(string firstName, string lastName)
{
fname = firstName;
lname = lastName;
}
private string fname;
private string lname;
public override string ToString() => $"{fname} {lname}".Trim();
public void DisplayName() => Console.WriteLine(ToString());
}
class Example
{
static void Main()
{
Person p = new Person("Mandy", "Dejesus");
Console.WriteLine(p);
p.DisplayName();
}
}
Pour plus d’informations, consultez Méthodes (Guide de programmation C#).
Propriétés en lecture seule
Vous pouvez utiliser une définition de corps d’expression pour implémenter une propriété en lecture seule. Pour ce faire, utilisez la syntaxe suivante :
PropertyType PropertyName => expression;
L’exemple suivant définit une classe Location
dont la propriété en lecture seule Name
est implémentée comme une définition de corps d’expression qui retourne la valeur du champ privé locationName
:
public class Location
{
private string locationName;
public Location(string name)
{
locationName = name;
}
public string Name => locationName;
}
Pour plus d’informations sur les propriétés, consultez Propriétés (Guide de programmation C#).
Propriétés
Vous pouvez utiliser des définitions de corps d’expression pour implémenter la propriété get
et les accesseurs set
. L’exemple suivant montre comment faire :
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
Pour plus d’informations sur les propriétés, consultez Propriétés (Guide de programmation C#).
Événements
De même, l’événement add
et les remove
accesseurs peuvent être intégrés dans une expression :
public class ChangedEventArgs : EventArgs
{
public required int NewValue { get; init; }
}
public class ObservableNum(int _value)
{
public event EventHandler<ChangedEventArgs> ChangedGeneric = default!;
public event EventHandler Changed
{
// Note that, while this is syntactically valid, it won't work as expected because it's creating a new delegate object with each call.
add => ChangedGeneric += (sender, args) => value(sender, args);
remove => ChangedGeneric -= (sender, args) => value(sender, args);
}
public int Value
{
get => _value;
set => ChangedGeneric?.Invoke(this, new() { NewValue = (_value = value) });
}
}
Pour plus d’informations sur les événements, consultez Événements (C# Guide de programmation).
Constructeurs
Une définition de corps d’expression pour un constructeur se compose généralement d’une seule expression d’assignation ou d’un appel de méthode qui gère les arguments du constructeur ou qui initialise l’état de l’instance.
L’exemple suivant définit une classe Location
dont le constructeur a un seul paramètre de chaîne nommé name. La définition de corps d’expression assigne l’argument à la propriété Name
.
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
Pour plus d’informations, consultez Constructeurs (Guide de programmation C#).
Finaliseurs
Une définition de corps d’expression pour un finaliseur contient généralement des instructions de nettoyage, telles que des instructions qui libèrent les ressources non managées.
L’exemple suivant définit un finaliseur qui utilise une définition de corps d’expression pour indiquer que le finaliseur a été appelé.
public class Destroyer
{
public override string ToString() => GetType().Name;
~Destroyer() => Console.WriteLine($"The {ToString()} finalizer is executing.");
}
Pour plus d’informations, consultez Finaliseurs (Guide de programmation C#).
Indexeurs
Comme avec les propriétés, l’indexeur get
et les accesseurs set
se composent de définitions de corps d’expression si l’accesseur get
se compose d’une seule expression qui retourne une valeur ou que l’accesseur set
effectue une affectation simple.
L’exemple suivant définit un nom de la classe Sports
qui inclut un tableau String interne contenant les noms de certains sports. L’indexeur get
et les accesseurs set
sont implémentés en tant que définitions de corps d’expression.
using System;
using System.Collections.Generic;
namespace SportsExample;
public class Sports
{
private string[] types = [ "Baseball", "Basketball", "Football",
"Hockey", "Soccer", "Tennis",
"Volleyball" ];
public string this[int i]
{
get => types[i];
set => types[i] = value;
}
}
Pour plus d’informations, consultez Indexeurs (Guide de programmation C#).