Rufen Sie einen Konstruktor aus dem Körper des anderen in C#
Muss ich rufen Sie einen Konstruktor aus dem Körper des anderen. Wie kann ich das tun?
Grundsätzlich
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
}
}
- Wie wäre es mit einem Konstruktor wie public foo (int x, int y , string s)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht.
Müssen Sie einen Weg finden, um die Kette der Konstruktoren, in:
oder bewegen Sie Ihre Konstruktion, code in ein gemeinsames setup-Methode, wie folgt aus:
readonly
Variablen, aber kann ein Konstruktor übergebenreadonly
Variablen alsref
Parameter, um eine setup-Methode, die dann in der Lage wäre zu schreiben, um seineref
Parameter, auch wenn Sie nur-lese-Variablen.XFromString
undYFromString
müssen die statischen Methoden. Das ist meine Lieblings-Weg, es zu tun!this(x, y)
ist richtig, aber es werden vor dem start der Konstruktor-Körper:Beachten Sie, dass:
this
oderbase
- diesem Konstruktor kann die Kette auf ein anderes, natürlich.this
innerhalb der Argumente der anderen Konstruktor, einschließlich aufrufen von Instanz-Methoden - aber Sie kann Aufruf von statischen Methoden.Habe ich ein bisschen mehr Informationen in meinem Artikel über Konstruktor-Verkettung.
class A{ public A(IEnumerable<int> items) {...} public A(MyClass c) : this(c.Items) { ... } }
. Jede null-check in die zweite ctor wird nur ausgeführt, nachdemc
zugegriffen wird. Das zweite Tor werfen wird NRE wenn c null ist, statt des bevorzugtenArgumentNullException
. Wenn Sie möchten, um Ihre Felder nur Lesen, es gibt keine andere Möglichkeit, als zu implementieren dieselbe Logik in zwei ctors. Oder ist gibt es einen besseren Weg, dies zu tun?this(c.ThrowIfNull("c").Items)
public PcmSample(IPcmSample other) : this(other.ThrowIfNull("other").Channels, other.ThrowIfNull("other").Items)
ThrowIfNull
nur auf dem ersten...Zu nennen, sowohl Basis-und Klasse-Konstruktor explizit müssen Sie die folgende syntax verwenden, die unten gegeben (beachten Sie, dass in C# die Sie nicht verwenden können, es zu initialisieren-Felder, wie in C++):
//EDIT: Bemerkt, dass Sie verwendet haben, x,y in deinem Beispiel. Natürlich, Werte, die beim Aufruf ctor solche Weise können nicht Sie verlassen sich auf Parameter anderer Konstruktor, müssen Sie gelöst werden, andere Weg (Sie brauchen nicht zu Konstanten wenn, wie in den bearbeiteten code-Beispiel oben). Wenn
x
undy
berechnet sich auss
, können Sie es auf diese Weise:Wird dies nicht unterstützt - siehe Konstruktoren in C#.
Jedoch können Sie implementieren eine gemeinsame (private) - Methode, die Sie nennen, aus den verschiedenen Konstruktoren...
Habe ich lief in dieses problem, eine Zeit oder zwei, die mich... landete ich mit zu extrahieren, was Logik, die ich brauchte, im anderen Konstruktor in eine
private void
Methode und nannte es in beiden Orten.Gibt es einen Hinweis in Beschreibung von
MethodBase.Invoke
im MSDNI. e. erhalten Sie die Konstruktor-Methode von Reflexion und nennen es durch
Invoke
in Ihr new-Konstruktor Körper. Aber ich habe nicht versuchen es. Und, natürlich, diese Lösung haben eine Menge Nachteile.