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?
Oui, les deux sont en lecture seule, mais il y a une différence. Dans le premier, il y a un champ de support qui est initialisé à 0 avant que le constructeur ne soit exécuté. Vous pouvez modifier la valeur uniquement dans le constructeur , tout comme un champ en lecture seule normal. Le getter lui-même renvoie simplement la valeur du champ.
Dans le second, le getter renvoie 0 à chaque fois, sans champ.
Donc, pour éviter d'utiliser des propriétés implémentées automatiquement ou des membres avec une expression, 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; } }
Un exemple plus clair de la différence pourrait être vu comme ceci:
public DateTime CreationTime { get; } = DateTime.UtcNow;
public DateTime CurrentTime => DateTime.UtcNow;
Si vous créez un seul objet, sa propriété CreationTime
donnera toujours le même résultat, car elle est stockée dans un champ en lecture seule, initialisé lors de la construction de l'objet. Cependant, chaque fois que vous accédez à la propriété CurrentTime
, DateTime.UtcNow
sera évalué, ce qui donnera un résultat potentiellement différent.
Une différence est lorsque 0
est évalué: lors de la création de l'objet ou lorsque la propriété est utilisée.
Vous pouvez mieux voir cela avec les propriétés DateTime:
class SomeTestClass
{
public DateTime Start { get; } = DateTime.Now;
public DateTime Now => DateTime.Now;
}
La propriété Start
renvoie toujours le même temps (à compter du moment où l'instance a été créée), tandis que Now
change pour refléter l'heure actuelle.
Explication:
La première version ("Start") fournit une valeur initiale qui peut même être écrasée par le constructeur. Donc, ceci est évalué une seule fois.
La deuxième version ("Maintenant") fournit l'expression qui sera le "getter" de cette propriété. Donc, ceci est évalué chaque fois que la propriété est lue. Il n'y a même pas de champ de support que le constructeur puisse écraser.
Ce sont des fonctionnalités du langage C # 6.
Premier exemple
public int Number { get; } = 0
Le premier exemple est un propriété auto getter-only . Le champ de sauvegarde d'une propriété auto uniquement en lecture est déclaré implicitement en lecture seule.
Deuxième exemple
public int Number => 0;
Et le deuxième exemple est corps d'expression sur des membres de fonctions similaires à des propriétés . Notez qu'il n'y a pas de mot clé get
: il est impliqué par l'utilisation de la syntaxe du corps de l'expression.
Les deux sont en lecture seule.