Do prostego konstruktora łańcuchowych, można użyć specjalnych słów kluczowych this
lub base
się odnosić do innych konstruktorów bieżącego lub dominującej za klasę. Możesz używać parametrów konstruktora wykonawczego jako parametrów do powiązanego konstruktora i możesz łączyć je przy użyciu dowolnego pojedynczego wyrażenia zgodnego z . Jest to zasadniczo ta sama reguła, która ma zastosowanie do każdego innego wyrażenia wbudowanego dostarczanego do wywołania funkcji, z tym że powinieneś unikać używania jakichkolwiek elementów klasy (ponieważ nie została ona jeszcze zbudowana) i ograniczyć się do stałych i parametrów przekazujących:
public foo (Uri someUrl)
{
this.url = someUrl;
}
public foo (string path, string query)
: this(new Uri(String.Concat(path, query)))
{
// this.url is now set and available.
}
To będzie działać tak długo, jak przetwarzania, które trzeba zrobić, można zrobić w jednym wyrażeniu wartości. Jeśli potrzebujesz, na przykład, zrobienia czegoś innego z Uri
, zanim zostanie ona wysłana do innego konstruktora, lub jeśli potrzebujesz skomplikowanej logiki, nie będziesz w stanie uciec z tą techniką. Alternatywą jest byłaby kodu do metody inicjalizacji:
public foo (Uri someUrl)
{
this.init(someUrl);
}
public foo (string path, string query)
{
var url = String.Concat(path, query);
url = url.Replace("http://", "https://");
this.init(url);
}
private void init (Uri someUrl)
{
this.url = someUrl;
}
Głosowanie w celu ponownego otwarcia. Odpowiedź w duplikacie jest poprawna, ale jest bardziej zorientowana na "prosty" parametr przekazywany do kolejnego konstruktora. PO post sugeruje, że istnieje pewne przetwarzanie do wykonania URI przed przekazaniem go dalej. Bardziej odpowiednią odpowiedzią byłoby posiadanie wspólnej metody, którą obaj konstruktorzy nazywają i przekazują parametry przez odniesienie. – keyboardP
@keyboardP, zgadzam się z tobą. Zmodyfikowałem tytuł, aby dokładniej to odzwierciedlić i głosowałem za ponownym otwarciem. (również szukał duplikatów tego niuansu i pojawił się pusty) –
Dzięki za ponowne otwarcie. –