web-dev-qa-db-fra.com

Propriétés avec corps d'expression vs {get; ensemble;}

Lorsque Visual Studio 2017 génère des propriétés pour moi, il utilise toujours les nouvelles propriétés contenant une expression, par exemple:

private static string username;
internal static string Username { get => username; set => username = value; }

Y a-t-il un avantage à utiliser ce style par rapport à ce qui suit ou s'agit-il simplement d'une question de préférence et de lisibilité?

internal static string Username { get; set; }
5
Max

Quelques avantages que je peux voir rapidement dans le second style:

  1. Vous tapez moins.
  2. Peut être lu rapidement.
  3. Le lecteur ne pense pas que le getter ou le setter font quelque chose de spécial.
  4. Rechercher toutes les références renvoie moins de résultats.
  5. L'expression evaulator n'est pas déclenchée par le compilateur.

Modifier

J'ai raté un problème majeur avec le premier style. Voir la réponse de poke ci-dessous.

2
dotNET

La syntaxe avec expression est pratique à utiliser dans les cas suivants:

Obtenir ou définir uniquement la propriété

public DateTime Date => DateTime.Now;

Les méthodes

public IEnumerable<string> GetData => SomeMethodThatReturnData.Select(x => x.Name);

Et constructeur avec 1 paramètre d'entrée 

public SomeClass(IRepository repository) => _repository = repository;
2
Sergey

Oui, il y a une différence; un grand en fait. Votre ancienne solution créera une boucle infinie car la propriété getter and setter se réfère elle-même.

string Username { get => Username; set => Username = value; }

Ceci est strictement équivalent à ce qui suit (puisqu'il ne s'agit que de sucre syntaxique):

string Username
{
    get
    {
        return Username;
    }
    set
    {
        Username = value;
    }
}

Ainsi, le getter et le configurateur de la propriété Username font tous deux référence au membre Username qui est lui-même. Ainsi, lorsque vous accédez au membre, celui-ci s’appellera de façon répétée pour toujours et ne obtiendra jamais de résultat.

Vous vouliez probablement faire ce qui suit:

string _username;
string Username { get => _username; set => _username = value; }

Vous avez maintenant un champ de sauvegarde que vous référencez pour stocker réellement la valeur de la propriété. Cela fonctionne bien et il n’ya aucune différence avec la syntaxe plus détaillée de getter et de setter. Il compile à la même chose; C-6 vous permet simplement de simplifier un peu la tâche.

La différence restante est le champ de sauvegarde explicite par rapport au champ de sauvegarde créé automatiquement lors de l'utilisation d'une propriété automatique. Que vous souhaitiez utiliser la propriété auto dépend un peu de votre style, mais en général, il n'y a aucune raison de ne pas les utiliser si vous allez créer le même champ de sauvegarde autrement manuellement. Bien sûr, si vous ne stockez pas la valeur dans un champ de sauvegarde standard et/ou si vous avez besoin d'une logique supplémentaire, vous ne pouvez bien sûr pas utiliser les propriétés automatiques ici. Mais dans ce cas, vous n’obtiendrez probablement pas de propriétés d’expression. Voir aussi cette question sur les propriétés automatiques.

1
poke