Appel d'un constructeur à partir du corps de l'autre en C#
J'ai besoin d'appeler un constructeur à partir du corps d'un autre. Comment puis-je le faire?
Fondamentalement
class foo {
public foo (int x, int y)
{
}
public foo (string s)
{
//... do something
//Call another constructor
this (x, y); //Doesn't work
foo (x, y); //neither
}
}
- Comment un constructeur comme les foo (int x, int y , string s)
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas.
Vous aurez à trouver un moyen pour la chaîne de la constructeurs, comme dans:
ou de déplacer votre code de construction dans une commune de la méthode de configuration, comme ceci:
readonly
variables, mais un constructeur peut passerreadonly
variables commeref
des paramètres à une méthode de configuration qui serait alors en mesure d'écrire à sonref
de paramètres, même s'ils sont variables en lecture seule.XFromString
etYFromString
doivent être des méthodes statiques. C'est ma façon préférée de le faire!this(x, y)
est juste, mais il doit être avant le début du corps du constructeur:Noter que:
this
oubase
- que le constructeur de la chaîne à l'autre, bien sûr.this
dans les arguments de l'autre constructeur, y compris l'appel de méthodes d'instance - mais vous peut appeler des méthodes statiques.J'ai un peu plus d'informations dans mon article sur le constructeur de chaînage.
class A{ public A(IEnumerable<int> items) {...} public A(MyClass c) : this(c.Items) { ... } }
. Toute null vérifier dans le deuxième ctor ne seront exécutées qu'aprèsc
est accessible. La deuxième ctor va lancer une NRE si c est nul, au lieu de le préférerArgumentNullException
. Si vous voulez garder vos champs en lecture seule, il n'y a pas d'autre possibilité que d'appliquer la même logique à deux ctors. Ou est il y a une meilleure façon de le faire?this(c.ThrowIfNull("c").Items)
public PcmSample(IPcmSample other) : this(other.ThrowIfNull("other").Channels, other.ThrowIfNull("other").Items)
ThrowIfNull
seulement sur la première...D'appeler à la fois de base et de ce constructeur de la classe explicitement, vous devez utiliser la syntaxe indiquée ci-dessous (à noter qu'en C# vous ne pouvez pas l'utiliser pour initialiser les champs comme en C++):
//EDIT: Remarqué que vous avez utilisé x,y dans votre échantillon. Bien sûr, les valeurs données lors de l'appel de ctor un tel moyen ne peut pas compter sur les paramètres de l'autre constructeur, ils doivent être résolus autre façon (ils n'ont pas besoin d'être des constantes même si, comme dans édités exemple de code ci-dessus). Si
x
ety
est calculée à partir des
, vous pouvez le faire de cette façon:Ce n'est pas pris en charge - voir Les constructeurs en C#.
Cependant, vous pouvez mettre en œuvre une politique (privé) méthode que vous appelez de la part des différents constructeurs...
J'ai rencontré ce problème une fois ou deux moi-même... j'ai fini par avoir à extraire tout ce logique dont j'avais besoin que les autres constructeur dans un
private void
de la méthode et de l'appeler dans les deux endroits.Il y a une note dans description de
MethodBase.Invoke
dans MSDNI. e. vous pouvez obtenir du Constructeur par la méthode de la réflexion et de l'appeler par
Invoke
dans votre nouveau corps du constructeur. Mais je n'ai pas essayer. Et, bien sûr, cette solution ont beaucoup d'inconvénients.