web-dev-qa-db-fra.com

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?

153
WoIIe

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.

264
Jon Skeet

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.

247
Hans Kesting

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.

20
Jehof