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; }
Quelques avantages que je peux voir rapidement dans le second style:
J'ai raté un problème majeur avec le premier style. Voir la réponse de poke ci-dessous.
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;
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.