Propriétés implémentées automatiquement
Les propriétés implémentées automatiquement rendent la déclaration de propriété plus concise lorsqu’aucune autre logique n’est requise dans les accesseurs de propriétés. Elles permettent également au code client de créer des objets. Quand vous déclarez une propriété comme indiqué dans l'exemple suivant, le compilateur crée un champ de stockage privé et anonyme uniquement accessible via les accesseurs get
et set
de la propriété. init
les accesseurs peuvent également être déclarés en tant que propriétés implémentées automatiquement.
L’exemple suivant montre une classe simple qui a des propriétés implémentées automatiquement :
// This class is mutable. Its data can be modified from
// outside the class.
public class Customer
{
// Auto-implemented properties for trivial get and set
public double TotalPurchases { get; set; }
public string Name { get; set; }
public int CustomerId { get; set; }
// Constructor
public Customer(double purchases, string name, int id)
{
TotalPurchases = purchases;
Name = name;
CustomerId = id;
}
// Methods
public string GetContactInfo() { return "ContactInfo"; }
public string GetTransactionHistory() { return "History"; }
// .. Additional methods, events, etc.
}
class Program
{
static void Main()
{
// Initialize a new object.
Customer cust1 = new Customer(4987.63, "Northwind", 90108);
// Modify a property.
cust1.TotalPurchases += 499.99;
}
}
Vous ne pouvez pas déclarer automatiquement les propriétés implémentées dans les interfaces. Les propriétés automatiquement implémentées et sauvegardées par champ déclarent un champ de stockage d’instance privée, et les interfaces ne peuvent pas déclarer de champs d’instance. La déclaration d’une propriété dans une interface sans définir de corps déclare une propriété avec des accesseurs. Chaque type qui implémente cette interface doit implémenter cette propriété.
Vous pouvez initialiser automatiquement les propriétés implémentées de la même façon que les champs :
public string FirstName { get; set; } = "Jane";
La classe qui est illustrée dans l'exemple précédent est mutable. Le code client peut modifier les valeurs dans les objets après leur création. Dans les classes complexes qui contiennent un comportement significatif (méthodes) et des données, il est souvent nécessaire d’avoir des propriétés publiques. Toutefois, pour les petites classes ou petits structs qui encapsulent simplement un ensemble de valeurs (données) et qui ont peu ou pas de comportements, vous devez utiliser l’une des options suivantes pour rendre les objets immuables :
- Déclarez uniquement un accesseur
get
(immuable partout, à l’exception du constructeur). - Déclarez un accesseur
get
et un accesseurinit
(immuable partout, sauf pendant la construction de l’objet). - Déclarez l’accesseur
set
comme privé (immuable pour les consommateurs).
Pour plus d’informations, consultez Comment implémenter une classe légère avec des propriétés implémentées automatiquement.
Vous devrez peut-être ajouter la validation à une propriété implémentée automatiquement. C# 13 ajoute des propriétés de champ sauvegardées en tant que fonctionnalité d’aperçu. Vous utilisez le field
mot clé pour accéder au champ de stockage synthétisé du compilateur d’une propriété implémentée automatiquement. Par exemple, vous pouvez vous assurer que la FirstName
propriété de l’exemple précédent ne peut pas être définie null
sur ou sur la chaîne vide :
public string FirstName
{
get;
set
{
field = (string.IsNullOrWhiteSpace(value) is false
? value
: throw new ArgumentException(nameof(value), "First name can't be whitespace or null"));
}
} = "Jane";
Cette fonctionnalité vous permet d’ajouter une logique aux accesseurs sans vous obliger à déclarer explicitement le champ de stockage. Vous utilisez le field
mot clé pour accéder au champ de stockage généré par le compilateur.
Important
Le field
mot clé est une fonctionnalité d’aperçu en C# 13. Vous devez utiliser .NET 9 et définir votre <LangVersion>
élément preview
dans votre fichier projet afin d’utiliser le field
mot clé contextuel.
Vous devez être prudent à l’aide de la field
fonctionnalité de mot clé dans une classe qui a un champ nommé field
. Le nouveau field
mot clé ombre un champ nommé field
dans l’étendue d’un accesseur de propriété. Vous pouvez modifier le nom de la field
variable ou utiliser le @
jeton pour référencer l’identificateur field
en tant que @field
. Pour plus d’informations, lisez la spécification de fonctionnalité pour le field
mot clé.