2010-05-20 4 views
39

Existe-t-il un moyen d'empêcher l'utilisation du constructeur par défaut? Tout ce que je peux penser est de lancer une exception, mais je voudrais quelque chose qui provoque une erreur de compilation.Empêche l'utilisation du constructeur par défaut

+3

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

Répondre

80
  • Si tout est statique dans la classe, pensez à en faire une classe statique. De cette façon, vous n'obtiendrez aucun constructeur.
  • Si vous voulez un constructeur sans paramètre, mais vous ne voulez pas qu'il soit public, déclarer explicitement et de le rendre privé (ou etc interne)
  • Si vous ne voulez pas un constructeur parameterless mais ne veulent constructeurs avec des paramètres, puis simplement déclarer ceux - le constructeur par défaut ne sera pas généré pour vous

Je pense qui devrait couvrir toutes les bases ...

+0

Vous avez dit à peu près exactement ce que je tapais juste :) – Joel

+0

Je voudrais savoir sur les classes statiques il y a longtemps. – luiscubal

+1

sauf si c'est une structure et non une classe. Si c'est le cas, le ctor par défaut est généré (une bonne chose donc tous les accessoires sont initialisés) mais appelable (malheureusement) - c'est-à-dire que je veux forcer l'utilisateur à utiliser le ctor avec des paramètres. –

35

Rendez-le privé.

Ainsi,

class SomeClass 
{ 
    private SomeClass() 
    { 
    } 

    public SomeClass(int SomeParam) 
    { 
    } 
} 
+0

+1 pour le point. – corsiKa

+9

Si vous n'en avez pas besoin dans le type (ou les 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é. –

+0

@Jon Je suis d'habitude une ceinture et des bretelles genre de gars donc je ferais normalement de cette façon de toute façon; De cette façon, ce que j'essaie de faire est clair pour quiconque le regarde. Bon à savoir qu'il est géré automatiquement par le compilateur, cependant, si j'oublie. –

8

Vous pouvez simplement le rendre privé:

private MyClass() 
{ 
} 

Sinon (si vous ne saviez pas déjà) si vous déclarez seulement un constructeur avec des paramètres, la valeur par défaut d'un ISN pas ajouté par le compilateur, par exemple

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

Une chose à mentionner que d'autres n'ont pas. Le constructeur par défaut doit toujours être capable de configurer les bits d'implémentation par défaut, pour éviter leur réutilisation. Ce n'est pas un problème s'il est privé, car vous pouvez toujours passer à un constructeur privé. Vous le rendez juste indisponible aux sources extérieures.

private MyClass() 
{ 
} 

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

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

1

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

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

Questions connexes