107 votes

Propriété automatisée avec getter uniquement, peut être définie, pourquoi ?

J'ai créé une propriété automatisée :

public int Foo { get; } 

C'est un getter seulement. Mais quand je construis un constructeur, je peux changer la valeur :

public MyClass(string name)
{
    Foo = 5;
}

Pourquoi est-ce possible, même s'il s'agit d'une opération de type "get-only" ?

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

133voto

tom_redox Points 43

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

C'est une conception stupide. Cela devrait être une erreur de compilation si elle est définie à un endroit où la propriété est considérée comme étant en lecture seule.

0 votes

Ce qui est bizarre pour moi, c'est qu'il y a toujours une erreur de compilation qui dit que CS0200 C# Property or indexer cannot be assigned to -- it is read only lors de l'utilisation d'une propriété ordinaire. Les "Getter-only auto-properties" sont-elles considérées comme étant en lecture seule ou non ?

31voto

Yacoub Massad Points 16759

C'est une nouvelle fonctionnalité en C#6 qui vous permet de créer des propriétés en lecture seule et d'initialiser leurs valeurs à partir du constructeur (ou en ligne lorsque vous les déclarez).

Si vous essayez de modifier la valeur de cette propriété en dehors du constructeur, vous obtiendrez une erreur de compilation.

Il est en lecture seule dans le sens où, une fois que vous avez initialisé sa valeur (en ligne ou dans le constructeur), vous ne pouvez pas la modifier.

0 votes

Alors, quelle est l'explication ? Quelle est la définition d'un getter ?

17voto

Douglas Points 25145

S'il n'était pas possible d'initialiser la propriété en lecture seule à partir du constructeur (ou d'un initialisateur de propriété automatique), alors elle serait inutile, car elle renverrait toujours la valeur par défaut pour son type (0 pour les numériques, null pour les types de référence). La même sémantique s'applique à en lecture seule dans toutes les versions de C#.

Pour définir une véritable propriété de type getter-only (qui ne peut pas être initialisée à partir du constructeur), vous devez préciser ce qu'elle renvoie dans le cadre de la définition :

public int Foo { get { return 5; } }

Ou, de manière plus concise, en C# 6 :

public int Foo => 5;

0 votes

Pas tout à fait vrai, les propriétés en lecture seule sont très utiles pour encapsuler certaines conditions dans votre code. Vous pouvez écrire une instruction if et presque n'importe quel code pour évaluer d'autres propriétés ou conditions et renvoyer une valeur appropriée chaque fois que vous lisez la propriété.

3 votes

@sebagomez : Je ne suis pas sûr de comprendre ce que vous voulez dire - n'est-ce pas ce que j'ai démontré dans mon exemple ?

4voto

Rahul Nikate Points 2792

La fonction de propriété automatique a été ajoutée au langage lors de la sortie de C# 3.0. Elle vous permet de définir une propriété sans champ de support, mais vous devez toujours utiliser le constructeur pour initialiser ces propriétés automatiques à une valeur autre que celle par défaut. C# 6.0 introduit une nouvelle fonctionnalité appelée initialisateur de propriété automatique qui vous permet d'initialiser ces propriétés sans constructeur comme ci-dessous :

Auparavant, un constructeur est nécessaire si vous voulez en utilisant une auto-propriété et initialiser une auto-propriété à une valeur par défaut comme ci-dessous :

public class MyClass
{
    public int Foo { get; }

    public Foo(int foo)
    {
        Foo = foo;
    }
}

Maintenant, dans C# 6.0, la possibilité d'utiliser un initialisateur avec la propriété automatique signifie qu'aucun code constructeur explicite n'est nécessaire.

public string Foo { get; } = "SomeString";

public List<string> Genres { get; } = new List<string> { "Comedy", "Drama" };

Vous pouvez trouver plus d'informations à ce sujet ici

1voto

supercat Points 25534

Une variable déclarée readonly peut être écrite à l'intérieur d'un constructeur, mais dans les langages qui respectent cet attribut, elle ne peut pas être modifiée après le retour du constructeur. Ce qualificatif a été fourni en tant que caractéristique du langage parce qu'il est souvent nécessaire pour les champs dont les valeurs varient en fonction des paramètres du constructeur (ce qui signifie qu'ils ne peuvent pas être initialisés avant le début du constructeur) mais ne doivent pas changer après le retour du constructeur, mais il n'était utilisable que pour les variables exposées en tant que champs. La sémantique de readonly -Dans de nombreux cas, les champs qualifiés auraient été parfaits pour les membres publics, sauf qu'il est souvent préférable pour les classes d'exposer les membres, même ceux qui sont immuables, comme des propriétés plutôt que des champs.

Tout comme les propriétés automatiques en lecture-écriture existent pour permettre aux classes d'exposer des propriétés mutables aussi facilement que des champs ordinaires, les propriétés automatiques en lecture seule existent pour permettre aux classes d'exposer des propriétés immuables aussi facilement que des champs ordinaires. readonly -Les champs qualifiés. Tout comme readonly -Les champs qualifiés peuvent être écrits dans un constructeur, de même que les propriétés get-only.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X