Question

Quelle est la différence entre l'utilisation de propriétés privées et non de champs privés

private String MyValue { get; set; }

// instead of

private String _myValue;

public void DoSomething()
{
   MyValue = "Test";

   // Instead of

   _myValue = "Test";
}

Existe-t-il un problème de performances? ou juste une convention de nommage?

Était-ce utile?

La solution

Les propriétés privées vous permettent d’abstraire vos données internes de sorte que les modifications apportées à la représentation interne n’affectent pas nécessairement d’autres parties de votre implémentation, même dans la même classe. Les terrains privés n'offrent pas cet avantage. Avec les propriétés automatiques en C # 3.0, il est rarement nécessaire d'implémenter directement des champs - privés ou publics.

Autres conseils

Le principal avantage d’une propriété (privée, publique, ...) est qu’elle peut produire une valeur calculée par rapport à une valeur définie. Par exemple

class Person { 
  private DateTime _birthday;
  private int _age { get { return (DateTime.Now - _birthday).TotalYears; }
}

L’avantage de ce modèle est qu’une seule valeur doit être mise à jour pour N autres valeurs afin de refléter le changement. Cela est vrai des propriétés indépendamment de l'accessibilité. Il n’existe aucun avantage spécifique d’une propriété privée par rapport à une propriété non privée (autre que celle de propriété privée bien sûr).

Il est rare que vous souhaitiez rendre une propriété privée. La disposition pour qu'une propriété soit privée n'est fournie que par souci d'exhaustivité. Et si votre propriété récupère / définit simplement la valeur du champ, il n'y a pas de différence de performances car elle sera probablement insérée par le compilateur JIT.

Autre que ce qui a déjà été répondu, performances, symantics et complétude, il y a un cas valide que j'ai vu pour les propriétés privées au lieu d'un champ privé:

public class Item
{
    private Item _parent;
    private List<Item> _children;

    public void Add(Item child)
    {
        if (child._parent != null)
        {
            throw new Exception("Child already has a parent");
        }
        _children.Add(child);
        child._parent=this;
    }
}

Supposons que nous ne voulions pas exposer Parent pour une raison quelconque, mais que nous souhaitions également effectuer des contrôles de validation. Un parent devrait-il pouvoir être ajouté en tant qu’enfant à l’un de ses enfants?

Pour résoudre ce problème, vous pouvez en faire une propriété et vérifier les références circulaires.

L'accès à la propriété sera (légèrement) plus lent car il appellera le getter / setter. L'avantage est que vous pouvez effectuer une validation des données, qui peut ensuite être filtrée en fonction des héritiers si vous modifiez la propriété pour qu'elle soit protégée, par exemple.

Lorsqu'il s'agit d'accès privé, les différences sont très minimes. Oui, il y a un impact négatif sur les performances (qui peut être optimisé par le JIT). Les propriétés d'envoi représentent un appel de méthode au lieu d'un accès direct à une adresse.

Le principal avantage de l’utilisation des propriétés est de permettre de modifier l’implémentation sans modifier la signature externe requise. Étant donné qu’ils sont accessibles en privé, toute modification apportée à la mise en œuvre n’affecte que le code local.

Lorsque je traite avec des membres privés, je ne vois aucun avantage à tirer des propriétés, à l'exception des conventions de votre équipe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top