154 votes

Différence de C # entre différents styles de getter

Je vois parfois des abréviations dans les propriétés du getter. Par exemple, ces deux types:

 public int Number { get; } = 0

public int Number => 0;
 

Est-ce que quelqu'un peut me dire s'il y a des différences entre les deux? Comment se comportent-ils? Sont-ils tous les deux en lecture seule?

266voto

Jon Skeet Points 692016

Oui, les deux d'entre eux sont en lecture seule, mais il y a une différence. Dans la première, il y a un champ de stockage qui est initialisé à 0 avant que le constructeur est exécuté. Vous pouvez changer la valeur que dans le constructeur, comme un champ en lecture seule. La lecture elle-même renvoie simplement la valeur du champ.

Dans la seconde, la lecture retourne 0 à chaque fois, avec pas de domaine en question.

Donc, pour éviter d'utiliser tout mis en place automatiquement des propriétés ou de l'expression du corps des membres à tous, nous avons:

Première version

private readonly int _number = 0;
public int Number { get { return _number; } }

Deuxième version

public int Number { get { return 0; } }

Plus clairement, la différence peut être perçue comme ceci:

public DateTime CreationTime { get; } = DateTime.UtcNow;
public DateTime CurrentTime => DateTime.UtcNow;

Si vous créez un objet unique, de ses CreationTime propriété donnera toujours le même résultat, car il est stocké dans un champ en lecture seule, initialisé sur la construction de l'objet. Cependant, chaque fois que vous accédez à l' CurrentTime de la propriété, qui va provoquer l' DateTime.UtcNow à être évalué, de sorte que vous aurez potentiellement un résultat différent.

248voto

Hans Kesting Points 17043

Une différence, c'est quand qu' 0 est évalué: à la création d'un objet ou lorsque la propriété est utilisée.

Vous pouvez voir ce mieux avec DateTime propriétés:

class SomeTestClass
{
    public DateTime Start { get; } = DateTime.Now;

    public DateTime Now => DateTime.Now;
}

L' Start de la propriété conserve son retour même temps (d'où l'instance a été créée), tandis que l' Now change pour refléter l'heure actuelle.

Explication:

La première version ("Start") fournit une valeur initiale qui peut même être remplacé par le constructeur. Donc ce n'est évaluée qu'une seule fois.
La deuxième version ("Maintenant") fournit l'expression qui sera le "getter" de cette propriété. C'est donc évalué chaque fois que la propriété est en lecture. Il n'y a même pas un champ de stockage que le constructeur ne peut remplacer.

21voto

Jehof Points 14720

Ce sont des C# 6 fonctions du langage.

Premier exemple

public int Number { get; } = 0

Le premier exemple est un getter-seulement la propriété d'auto. Le champ de stockage d'un getter seule auto-propriété est déclarée implicitement en readonly.

Deuxième exemple

public int Number => 0;

Et le deuxième exemple est l'expression d'organes sur les propriétés de la fonction les membres. Notez qu'il n'est pas tout get mot-clé: Il est sous-entendu par l'utilisation de l'expression corporelle de la syntaxe.

Les deux sont en lecture seule.

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