Réponses:
Oui, les deux sont en lecture seule, mais il y a une différence. Dans le premier, il y a un champ de sauvegarde qui est initialisé à 0 avant que le constructeur ne soit exécuté. Vous ne pouvez modifier la valeur que 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 simplement 0 à chaque fois, sans champ impliqué.
Donc, pour éviter d'utiliser des propriétés implémentées automatiquement ou des membres dotés d'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 CreationTime
propriété 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 CurrentTime
propriété, cela entraînera DateTime.UtcNow
une évaluation, de sorte que vous obtiendrez un résultat potentiellement différent.
Une différence est quand cela 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 Start
propriété continue de renvoyer la même heure (celle de la création de l'instance), tandis qu'elle 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. Cela n'est donc évalué qu'une seule fois.
La deuxième version ("Now") fournit l'expression qui sera le "getter" de cette propriété. Cela est donc évalué à chaque fois que la propriété est lue. Il n'y a même pas de champ de sauvegarde 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 une propriété automatique en lecture seule . Le champ de sauvegarde d'une propriété automatique en lecture seule est implicitement déclaré en lecture seule.
Deuxième exemple
public int Number => 0;
Et le deuxième exemple concerne les corps d'expression sur les membres de fonction de type propriété . Notez qu'il n'y a pas de get
mot clé: il est impliqué par l'utilisation de la syntaxe du corps de l'expression.
Les deux sont en lecture seule.
random.NextInt()
. La première version évaluera cela une fois et aura toujours la même valeur. Le second renverra une nouvelle valeur à chaque fois.