68 votes

Empêcher l'utilisation du constructeur par défaut

Existe-t-il un moyen d'empêcher l'utilisation du constructeur par défaut ?

Tout ce à quoi je pense, c'est de lancer une exception, mais je voudrais quelque chose qui provoque une erreur de compilation.

4 votes

Vous risquez d'avoir des problèmes si vous faites cela : Dans .NET, un constructeur sans paramètre par défaut est nécessaire pour un certain nombre de choses (liaison/sérialisation/etc.). Pensez à avoir des valeurs par défaut pour toutes les valeurs que vous devez définir via les paramètres du constructeur. Cela peut ne pas être important dans votre cas, mais cela vaut la peine d'être mentionné.

129voto

Jon Skeet Points 692016
  • Si tout dans la classe est statique, envisagez d'en faire une classe statique. De cette façon, vous n'aurez pas de constructeur du tout.
  • Si vous voulez un constructeur sans paramètre mais que vous ne voulez pas qu'il soit public, déclarez-le explicitement et rendez-le privé (ou interne, etc.).
  • Si vous ne voulez pas d'un constructeur sans paramètre mais que hacer si vous voulez des constructeurs avec des paramètres, déclarez simplement le constructeur paramétré - le constructeur par défaut ne sera pas généré pour vous.

I pensez à qui devrait couvrir toutes les bases...

0 votes

Tu as dit à peu près exactement ce que j'étais en train de taper :)

0 votes

J'aurais aimé connaître les classes statiques il y a longtemps.

5 votes

À moins qu'il ne s'agisse d'une structure et non d'une classe. Si c'est le cas, le ctor par défaut est généré (une bonne chose pour que tous les props soient initialisés) mais appelable (malheureusement) - c'est-à-dire que je veux forcer l'utilisateur à utiliser le ctor avec des params.

42voto

Michael Todd Points 9384

Rendez-le privé.

Donc,

class SomeClass
{
    private SomeClass()
    {
    }

    public SomeClass(int SomeParam)
    {
    }
}

13 votes

À moins que vous n'en ayez besoin dans le type (ou dans des types imbriqués), vous pouvez le supprimer entièrement ici - il ne sera généré que si aucun constructeur n'est explicitement déclaré.

1 votes

Je suis généralement du genre à porter des ceintures et des bretelles, donc je le ferais normalement de cette façon ; de cette façon, ce que j'essaie de faire est clair pour quiconque regarde. Il est bon de savoir que le compilateur s'en occupe automatiquement, si j'oublie.

4 votes

J'y parviendrais en ajoutant un commentaire sur le constructeur paramétré : "Si vous supprimez ce constructeur, veuillez vous assurer qu'il n'y a pas de constructeur public par défaut" ou quelque chose de ce genre. Actuellement, ce code vous donne essentiellement la permission de créer une instance sans aucun paramètre dans la classe. Cela posera également des problèmes s'il y a des variables en lecture seule, car vous devrez leur attribuer des valeurs...

10voto

Paolo Points 11860

Vous pouvez simplement le rendre privé :

private MyClass()
{
}

Alternativement (si vous ne le saviez pas déjà) si vous déclarez simplement un constructeur avec des paramètres, celui par défaut n'est pas ajouté par le compilateur, par ex.

private MyClass(string myParameter)
{
    //Can't call new MyClass() anymore
}

6voto

Gregory A Beamer Points 10975

Une chose à mentionner que d'autres n'ont pas fait. Le constructeur par défaut devrait toujours être capable de configurer les bits d'implémentation par défaut, pour éviter la réutilisation. Ce n'est pas un problème s'il est privé, car vous pouvez toujours enchaîner vers un constructeur privé. Vous le rendez simplement indisponible pour les sources extérieures.

private MyClass()
{
}

public MyClass(string something) : this()
{
}

Cela résout le problème. Notez cependant que protected peut en fait être une implémentation préférée si la classe n'est pas scellée.

1voto

mr.b Points 1786

En dehors des autres réponses, vous pouvez lire le texte suivant, pour plus d'informations sur le modèle Singleton, et quelques exemples. Le modèle Singleton repose sur le fait que le constructeur est privé.

http://www.yoda.arachsys.com/csharp/singleton.html

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