Vous pouvez dire que je suis fou, mais je suis le genre de personne qui aime les constructeurs avec des paramètres (si nécessaire), par opposition à un constructeur sans paramètres suivi d'une définition des propriétés. Mon raisonnement est le suivant : si les propriétés sont nécessaires pour construire l'objet, elles doivent être placées dans le constructeur. J'en tire deux avantages :
- Je sais que lorsqu'un objet est construit (sans erreur/exception), mon objet est bon.
- Cela permet d'éviter d'oublier de définir une certaine propriété.
Cet état d'esprit commence à me faire souffrir en ce qui concerne le développement des formulaires et des contrôles d'utilisation. Imaginez ceci UserControl
:
public partial class MyUserControl : UserControl
{
public MyUserControl(int parm1, string parm2)
{
// We'll do something with the parms, I promise
InitializeComponent();
}
}
Au moment de la conception, si je laisse tomber cette UserControl
sur un formulaire, j'obtiens un Exception
:
Échec de la création du composant 'MyUserControl' ...
System.MissingMethodException - Aucun constructeur sans paramètre n'a été défini pour cet objet.
Il me semble que le seul moyen de contourner ce problème était d'ajouter le constructeur par défaut (à moins que quelqu'un d'autre ne connaisse un autre moyen).
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
}
public MyUserControl(int parm1, string parm2)
{
// We'll do something with the parms, I promise
InitializeComponent();
}
}
Le but de ne pas inclure le constructeur sans paramètre était d'éviter de l'utiliser. Et je ne peux même pas utiliser le DesignMode
pour faire quelque chose comme :
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
if (this.DesignMode)
{
InitializeComponent();
return;
}
throw new Exception("Use constructor with parameters");
}
}
Cela ne fonctionne pas non plus :
if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
Bien, on avance...
J'ai mon constructeur sans paramètre, je peux le déposer sur le formulaire, et le formulaire InitializeComponent
ressemblera à ceci :
private void InitializeComponent()
{
this.myControl1 = new MyControl();
// blah, blah
}
Et croyez-moi, parce que je l'ai fait (oui, en ignorant les commentaires générés par Visual Studio), j'ai essayé de m'amuser et j'ai passé des paramètres à InitializeComponent
afin que je puisse les passer au constructeur de MyControl
.
Ce qui m'amène à ceci :
public MyForm()
{
InitializeComponent(); // Constructed once with no parameters
// Constructed a second time, what I really want
this.myControl1 = new MyControl(anInt, aString);
}
Pour moi, utiliser un UserControl
avec des paramètres au constructeur, je dois ajouter un deuxième constructeur dont je n'ai pas besoin ? Et instancier deux fois le contrôle ?
J'ai l'impression que je dois faire quelque chose de mal. Vous avez des idées ? Opinions ? Une assurance (si possible) ?