Il s'agit d'une nouvelle fonctionnalité de C# 6, "Getter-only auto-properties", également connue sous le nom de "Auto-Property Initializers for Read-Only Properties" (initialisateurs de propriété automatique pour les propriétés en lecture seule), comme indiqué dans cet article. Article du magazine MSDN "C# : The New and Improved C# 6.0" par Mark Michaelis et dans le Projet de spécification du langage C# 6.0 .
Le paramètre du champ en lecture seule n'est accessible que dans le constructeur. Dans tous les autres scénarios, le champ est toujours en lecture seule et se comporte comme avant.
Il s'agit d'une syntaxe pratique permettant de réduire la quantité de code à saisir et de supprimer la nécessité de déclarer explicitement une variable privée au niveau du module pour contenir la valeur.
Cette fonctionnalité a été jugée importante car, depuis l'introduction des propriétés auto-implémentées dans C#3, les propriétés mutables (celles qui ont un getter et un setter) sont devenues plus rapides à écrire que les propriétés immuables (celles qui n'ont qu'un getter), ce qui signifie que les gens étaient tentés d'utiliser des propriétés mutables pour éviter d'avoir à taper le code d'un champ de sauvegarde habituellement requis pour les propriétés en lecture seule. Pour en savoir plus sur les propriétés auto-implémentées, consultez le site Web de la Commission européenne. section pertinente du guide de programmation Microsoft C# .
Cet article de blog, '#1,207 - C# 6.0 - Auto-Property Initializers for Read-Only Properties' par Sean Sexton Il donne une bonne explication et un bon exemple comme suit :
Avant C# 6.0, si vous vouliez une propriété en lecture seule (immuable), vous deviez vous utilisiez généralement un champ de sauvegarde en lecture seule, initialisé dans le comme illustré ci-dessous.
public class Dog
{
public string Name { get; set; }
// DogCreationTime is immutable
private readonly DateTime creTime;
public DateTime DogCreationTime
{
get { return creTime; }
}
public Dog(string name)
{
Name = name;
creTime = DateTime.Now;
}
}
En C# 6.0, vous pouvez utiliser des propriétés auto-implémentées pour mettre en œuvre un système de contrôle de l'accès en lecture seule. propriété en lecture seule. Pour ce faire, vous utilisez une propriété auto-implémentée initialisateur. Le résultat est beaucoup plus propre que dans l'exemple précédent, dans lequel nous devions déclarer explicitement un champ de sauvegarde.
public class Dog
{
public string Name { get; set; }
// DogCreationTime is immutable
public DateTime DogCreationTime { get; } = DateTime.Now;
public Dog(string name)
{
Name = name;
}
}
Plus de détails peuvent également être trouvés dans le dépôt dotnet Roslyn sur GitHub :
Les propriétés automatiques peuvent maintenant être déclarées sans setter.
Le champ de support d'un auto-prop getter-only déclarée comme readonly (bien que cela n'ait d'importance qu'à des fins de réflexion). réflexion). Il peut être initialisé par un initialisateur sur la propriété comme dans l'exemple ci-dessus. [ ] être assignée dans le corps du constructeur du type déclarant, ce qui fait que la valeur sera directement affectée au champ sous-jacent :
Il s'agit d'exprimer les types de manière plus concise, mais notez qu'il s'agit également de une différence importante dans le langage entre les types mutables et immuables. immuables : les propriétés automatiques étaient un raccourci disponible seulement si si vous étiez prêt à rendre votre classe mutable, et donc la tentation était grande de par défaut était grande. Maintenant, avec les auto-propriétés de type getter uniquement, la le terrain de jeu a été nivelé entre mutable et immuable.
et dans le Projet de spécification du langage C# 6.0 (NB : La spécification du langage est finale en ce qui concerne Microsoft, mais il est important de noter que le langage n'a pas été modifié. doit encore être approuvé en tant que norme EMCA/ISO d'où le terme "projet") :
Propriétés mises en œuvre automatiquement
Une propriété mise en œuvre automatiquement (ou auto-pr est une propriété non abstraite et non externe dont les corps d'accesseur ne sont point-virgule. Les propriétés automatiques doivent avoir un accesseur get et peuvent éventuellement avoir un accesseur set.
Lorsqu'une propriété est spécifiée comme une propriété mise en œuvre automatiquement, un champ de sauvegarde caché est automatiquement disponible pour la propriété, et les accesseurs sont implémentés pour lire et écrire dans ce champ de sauvegarde. champ de sauvegarde. Si la propriété automatique n'a pas d'accesseur défini, le champ de sauvegarde est considéré comme un champ en lecture seule (Readonly fields). Tout comme un champ en lecture seule une auto-propriété getter-only peut également être affectée dans le corps du message. d'un constructeur de la classe englobante. Une telle affectation assigne directement au champ d'appui en lecture seule de la propriété.
Un auto-property peut éventuellement avoir un property_initializer, qui est appliqué directement au champ de support comme un variable_initializer (Initialisateurs de variables).
1 votes
Il n'utilise pas réellement un setter (parce qu'il n'en a pas). Elle définit directement le champ sous-jacent (qui nous est caché, c'est pourquoi vous devez utiliser le nom de la propriété).
18 votes
A quoi sert une propriété, si elle peut jamais être initialisée/réglée ? Yacoub Massad a parfaitement répondu à cette question