14 votes

Quel est le besoin d'un constructeur privé en C#?

Quel est le besoin d'un constructeur privé en C#? Je l'ai eu comme question pour un test de C#.

2voto

Mike Chaliy Points 8694

Par exemple, lorsque vous fournissez des méthodes d'usine pour contrôler l'instanciation...

public class Test(){

  private Test(){
  }

  void DoSomething(){
    // méthode d'instance
  }

  public static Test CreateCoolTest(){
    return new Test();
  }
}

2voto

Les constructeurs privés sont utilisés pour empêcher la création d'instances d'une classe lorsqu'il n'y a pas de champs ou de méthodes d'instance, comme la classe Math, ou lorsqu'une méthode est appelée pour obtenir une instance d'une classe. Si toutes les méthodes de la classe sont statiques, envisagez de rendre toute la classe statique. Pour plus d'informations, consultez les classes statiques et les membres de classe statiques.

class NLog
{
    // Constructeur privé:
    private NLog() { }

    public static double e = System.Math.E;  //2,71828...
}

Voici un exemple de classe utilisant un constructeur privé.

public class Counter
{
    private Counter() { }
    public static int currentCount;
    public static int IncrementCount()
    {
        return ++currentCount;
    }
}

class TestCounter
{
    static void Main()
    {
        // Si vous décommentez l'instruction suivante, elle générera
        // une erreur car le constructeur est inaccessible:
        // Counter aCounter = new Counter();   // Erreur

        Counter.currentCount = 100;
        Counter.IncrementCount();
        System.Console.WriteLine("Nouveau décompte : {0}", Counter.currentCount);
    }
}

1voto

Andrew Weir Points 310

Alors que ce lien est lié à java, je pense qu'il devrait vous aider à comprendre la raison car l'idée est à peu près la même.

Les constructeurs privés empêchent à une classe d'être explicitement instanciée par les appelants. Il existe quelques cas courants où un constructeur privé peut être utile:

  • classes contenant uniquement des méthodes utilitaires statiques
  • classes contenant uniquement des constantes
  • énumérations type-safe
  • singletons

1voto

RobV Points 13708

Vous pouvez l'utiliser avec l'héritage dans un cas où les arguments du constructeur de la classe de base sont de types différents de ceux du constructeur des classes enfants mais vous avez toujours besoin de la fonctionnalité de la classe de base dans la classe enfant par ex. les méthodes protégées.

Généralement cependant, cela devrait être évité autant que possible car il s'agit d'une mauvaise forme d'héritage à utiliser.

1voto

Jakob Gade Points 6006

Je suis en retard dans le jeu, mais en lisant toutes les autres réponses, je ne vois pas cette utilisation mentionnée:

J'utilise des constructeurs privés dans des scénarios où j'ai plusieurs (public) constructeurs, et ils ont tous du code en commun. Avec le chaînage de constructeurs, le code devient vraiment soigné et DRY.

N'oubliez pas, les variables privées en lecture seule ne peuvent être définies que dans les constructeurs, donc je ne peux pas utiliser de méthode régulière.

Exemple:

public class MyClass
{
    private readonly int _a;
    private readonly int _b;
    private readonly string _x;

    public MyClass(int a, int b, string x)
        : this(x)
    {
        _a = a;
        _b = b;
    }

    public MyClass()
        : this("(non défini)")
    {
        // Rien défini ici...
    }

    private MyClass(string x)
    {
        _x = x;
    }
}

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