136 votes

comprendre les paramètres privés

Je ne comprends pas la nécessité d'avoir des setters privés qui a commencé avec C# 2.

Pour moi, avoir une méthode setter, c'est permettre à l'utilisateur de définir certaines variables dans cette classe. Ce faisant, nous n'exposons pas les variables directement aux utilisateurs. Au lieu de cela, nous les laissons faire par le biais de cette méthode setter publique.

Pour moi, il s'agit d'utiliser l'"encapsulation". Certains arguments prétendent que les paramètres privés permettent d'appliquer l'encapsulation.

N'ai-je pas recours à l'encapsulation en utilisant des méthodes publiques de type "setter" ? Pourquoi avons-nous besoin de fixateurs privés ?

Quelle est la différence entre une classe immuable et une classe avec des paramètres privés ?

380voto

ktutnik Points 1711

Logiquement.

La présence d'un setter privé s'explique par le fait que l'on peut utiliser la propriété auto :

public int MyProperty { get; set; }

Que feriez-vous si vous vouliez le rendre accessible en lecture seule ?

public int MyProperty { get; }

Oh merde ! Je ne peux pas y accéder à partir de ma propre classe ; je devrais la créer comme une propriété normale :

private int myProperty;
public int MyProperty { get { return myProperty; } }

Hmm... mais j'ai perdu la fonction "propriété automatique"...

public int MyProperty { get; private set; }

AHHH c'est mieux !!

49voto

ChrisF Points 74295

Un setter privé est utile si vous avez une propriété en lecture seule et que vous ne voulez pas déclarer explicitement la variable d'appui.

Ainsi :

public int MyProperty
{
    get; private set;
}

est identique à :

private int myProperty;
public int MyProperty
{
    get { return myProperty; }
}

Pour les propriétés non implémentées automatiquement, cela vous donne un moyen cohérent de définir la propriété à partir de à l'intérieur de sorte que si vous avez besoin d'une validation, etc., vous n'avez qu'un seul endroit.

Pour répondre à votre dernière question, voici ce que dit le MSDN sur les paramètres privés :

Cependant, pour les petites classes ou structures qui encapsulent simplement un ensemble de valeurs (données) et ont peu ou pas de comportements, il est recommandé de rendre les objets immuables en déclarant l'accesseur set comme privé.

De la page MSDN sur les propriétés Auto Implemented

30voto

tsemer Points 350

Avec l'introduction de C# 6.0 et la syntaxe de Initialisateurs d'auto-propriétés Les paramètres privés ne sont plus nécessaires pour les propriétés qui ne sont définies qu'à l'initialisation, soit en ligne, soit dans le constructeur.

Ces nouvelles syntaxes sont désormais compilées :

Propriété initialisée en ligne

public class MyClass1 {
  public string MyProperty { get; } = "Aloha!"
}

Propriété initialisée par le constructeur

public class MyClass2 {
  public string MyProperty { get; }

  public MyClass2(string myProperty) {
    MyProperty = myProperty;
  }
}

18voto

Erik Funkenbusch Points 53436

C'est assez simple. Les paramètres privés permettent de créer des propriétés publiques ou protégées en lecture seule.

C'est tout. C'est la seule raison.

Oui, vous pouvez créer une propriété en lecture seule en spécifiant uniquement le getter, mais avec les propriétés auto-implémentées, vous devez spécifier à la fois le get et le set, donc si vous voulez qu'une propriété auto-implémentée soit en lecture seule, vous devez doit utiliser des paramètres privés. Il n'y a pas d'autre solution.

Il est vrai que les Private setters n'ont pas été créés spécifiquement pour les propriétés en lecture seule auto-implémentées, mais leur utilisation est un peu plus ésotérique pour d'autres raisons, principalement centrées sur les propriétés en lecture seule et l'utilisation de la réflexion et de la sérialisation.

7voto

lauhw Points 18

Je ne comprends pas la nécessité d'avoir des setters privés qui a commencé avec C# 2.

Par exemple, la classe Facture permet à l'utilisateur d'ajouter ou de supprimer des articles de la propriété Articles, mais elle ne lui permet pas de modifier la référence Articles (c'est-à-dire que l'utilisateur ne peut pas affecter la propriété Articles à une autre instance d'objet de liste d'articles).

public class Item
{
  public string item_code;
  public int qty;

  public Item(string i, int q)
  {
    this.item_code = i;
    this.qty = q;
  }
}

public class Invoice
{
  public List Items { get; private set; }

  public Invoice()
  {
    this.Items = new List();
  }
}

public class TestInvoice
{
  public void Test()
  {
    Invoice inv = new Invoice();
    inv.Items.Add(new Item("apple", 10));

    List my_items = new List();
    my_items.Add(new Item("apple", 10));

    inv.Items = my_items;   // compilation error here.
  }
}

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