25 votes

Le "set" privé en C# - j'ai du mal à m'y retrouver

J'ai vu beaucoup d'exemples de code écrits en utilisant quelque chose comme (veuillez pardonner le fait que ce soit horriblement théorique) :

public class Test
{
   public object Thingy { get; private set; }
}

Malheureusement, ce genre d'exemples n'explique jamais vraiment pourquoi 'set' est défini comme privé. Je me demande donc s'il n'y a pas un bon exemple courant qui me permettrait de comprendre pourquoi on utilise quelque chose comme ça.

Je le vois en quelque sorte - la propriété peut être exécutée pour traiter une logique supplémentaire en plus de la définition de ce champ. Je ne sais pas comment l'invoquer et pourquoi utiliser cette approche plutôt qu'une méthode setter générique.

1voto

Jeff Yates Points 36725

Cette syntaxe vous permet de fournir une propriété publique qui apparaît en lecture seule aux consommateurs de votre API mais qui peut être modifiée en interne. En procédant à une implémentation automatique de cette manière, vous évitez d'avoir à écrire du code passe-partout tel qu'un setter distinct ou un champ de sauvegarde pour la valeur, et vous laissez de la place dans votre conception pour ajouter un algorithme de paramétrage sur mesure si cela s'avère nécessaire à un moment donné dans le futur sans avoir à prendre une décision immédiate.

1voto

Jeffrey L Whitledge Points 27574

Private set est très pratique pour les types de valeurs immuables simples.

struct Point
{
    public int X { get; private set; }
    public int Y { get; private set; }
    public Point(int x, int y)
    {
        this = default(Point);
        X = x;
        Y = y;
    }
}

0voto

Mark H Points 9127

C'est juste laziness qui provient des propriétés automatiques. Avant l'existence des propriétés automatiques, les gens implémentaient le getter et omettaient le setter pour les propriétés qui sont censées être en lecture seule.

public class Test
{
   private /*readonly*/ Type _thingy;
   public Type Thingy { get { return _thingy; } }
}

Espérons que C# 5 vous permettra de créer des propriétés automatiques avec un getter uniquement - parce que c'est ce que tout le monde veut. (Ils devraient aussi faire des setters en lecture seule dans les auto-props, j'en ai vraiment besoin).

0voto

Peter Kelly Points 5758

Pour répondre à la question d'un scénario courant où cela pourrait être utilisé... Dans un modèle MVP, si votre modèle expose certaines propriétés pour votre présentateur, j'écrirais

public string Bazinga { get; private set; }

Le modèle peut modifier cette valeur, mais pas les autres classes qui l'utilisent.

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