79 votes

Comment puis-je accéder à la variable de support d'une propriété auto-implémentée ?

Dans le passé, nous déclarions les propriétés comme ceci :

public class MyClass
{
    private int _age;

    public int Age
    {
          get{ return _age;  }
          set{ _age = value; }
    }
}

Maintenant on peut le faire :

public class MyClass
{
    public int Age {get; set;} 
}

Ma question est la suivante : comment puis-je accéder à la variable privée qui est créée automatiquement en utilisant cette notation ?

Je préfère accéder à la variable privée et non à l'accesseur public 'Age'. Existe-t-il une notation par défaut pour accéder à la variable privée, ou est-ce tout simplement impossible ?

92voto

Wilka Points 13239

L'objectif des nouvelles propriétés automatiques est de réduire la quantité de code passe-partout que vous devez écrire lorsque vous avez une simple propriété qui ne nécessite pas de logique particulière dans le get ou le set.

Si vous voulez accéder au membre privé que ces propriétés utilisent, c'est généralement pour plusieurs raisons :

  • Vous avez besoin de plus qu'un simple get/set - dans ce cas, vous devriez simplement éviter d'utiliser les propriétés automatiques pour ce membre.
  • Vous voulez éviter l'impact sur les performances de passer par le get ou le set et simplement utiliser le membre directement - dans ce cas, je serais surpris s'il y avait vraiment un impact sur les performances. Les membres get/set simples sont très très faciles à mettre en ligne, et dans mes tests (certes limités) je n'ai pas trouvé de différence entre l'utilisation des propriétés automatiques et l'accès direct au membre.
  • Vous voulez seulement avoir un accès public en lecture (c'est-à-dire juste un "get") et que la classe écrive directement sur le membre - dans ce cas, vous pouvez utiliser un ensemble privé dans votre propriété automatique, par exemple.

    public class MyClass
    {
        public int Age {get; private set;} 
    }

Cela couvre généralement la plupart des raisons pour lesquelles on souhaite accéder directement au champ de sauvegarde utilisé par les propriétés automatiques.

23voto

chakrit Points 29562

Votre utilisation des propriétés automatiques implique que vous n'avez pas besoin d'une logique d'obtention/réinitialisation de la propriété, ce qui rend inutile l'utilisation d'une variable de soutien privée.

N'utilisez pas les propriétés automatiques si vous avez une logique complexe dans votre classe. Allez-y simplement private int _age et les getters/setters normaux comme vous le feriez normalement.

À mon avis, les propriétés automatiques sont plus adaptées à la mise en œuvre rapide d'objets jetables ou de capsules de données temporaires, par exemple :

public class TempMessage {
    public int FromID { get; set; }
    public int ToID { get; set; }
    public string Message { get; set; }
}

Où vous n'avez pas besoin de beaucoup de logique.

12voto

Scott Dorman Points 25000

Cette syntaxe est communément appelée "sucre syntaxique", ce qui signifie que le compilateur prend cette syntaxe et la traduit en quelque chose d'autre. Dans votre exemple, le compilateur générerait un code qui ressemblerait à ceci :

[CompilerGenerated]
private int <Age>k_BackingField;

public int Age
{
   [CompilerGenerated]
   get
   {
      return this.<Age>k_BackingField;
   }
   [CompilerGenerated]
   set
   {
      this.<Age>k_BackingField = value;
   }

Même en sachant tout ça, vous pourriez probablement accéder directement au champ de sauvegarde, mais cela va à l'encontre de l'objectif de l'utilisation des propriétés automatiques. Je dis probablement parce que vous dépendez alors d'un détail d'implémentation qui pourrait changer à tout moment dans une future version du compilateur C#.

10voto

macbirdie Points 9417

En coulisses, ce qui se passe, c'est l'injection d'une variable membre privée, préfixée par <>k__AutomaticallyGeneratedPropertyField#

De Les propriétés automatiques de C# 3.0 expliquées

Bien qu'il soit possible d'utiliser directement ce membre privé, c'est très peu pratique et inutile.

7voto

Wedge Points 11910

Vous ne devriez pas, et il est très peu probable que vous en ayez besoin. Si vous avez besoin d'accéder à la propriété, utilisez simplement la propriété publique (par exemple this.Age). Le champ privé n'a rien de spécial par rapport à la propriété publique, l'utiliser de préférence à la propriété n'est qu'une superstition.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X