: этот (foo) синтаксис в конструкторах С#?
Время от времени я сталкиваюсь с синтаксисом, который я видел раньше, но никогда не использовал. Это один из тех случаев.
Может кто-нибудь объяснить цель ": this" или ": base" после метода конструктора С#?
Например:
public MyClass(SomeArg arg) : this(new SomethingElse(), arg)
{
}
Я чувствую, что он используется для сопоставления аргумента по умолчанию другому методу конструктора.
Ответы
Ответ 1
Ты в основном прав. this()
вызывает конструктор в текущем экземпляре, base()
вызывает конструктор супертипа в текущем экземпляре. Они обычно используются для обработки перегрузок конструктора, поэтому вы можете добавлять дополнительные параметры, не разбирая их на отдельный метод.
Ответ 2
Ваше чувство кишки правильное. Синтаксис используется для вызова перегруженных конструкторов в одном классе:
public class Test
{
public Test() : this("Called from default constructor") { }
public Test(String msg)
{
Console.WriteLine(msg);
}
}
Следующий код:
public static void Main(String[] args)
{
Test t1 = new Test();
Test t2 = new Test("Called from Main function");
}
Выводит следующие
Called from default constructor
Called from main function
Аналогично, : base(someParams)
используется для вызова базовых конструкторов.
Ответ 3
Вы правы.
: base (...) вызывает конструктор базового класса.
: этот (...) вызывает другой конструктор определяющего класса. Большую часть времени он работает просто как фасад.
Ответ 4
Каждый конструктор в классе .NET гарантирует, что конструктор в наследуемом ему классе также называется.
Итак, если у вас есть следующие классы:
public class Base { }
public class Something : Base { }
public class Else : Something { }
то конструктор в Else вызовет конструктор в Something, который также вызовет конструктор в Base.
Конструктор, вызываемый в базовом классе (т.е. тот, с которого вы спускаетесь) всегда является конструктором без параметров.
Если у вас его нет или вы хотите переопределить его, вы можете переопределить его, указав базу (некоторые параметры здесь). Это выберет правильный конструктор в базовом классе.
Вы также можете попросить конструктора сначала вызвать другой конструктор в том же классе на том же уровне. Это можно использовать, чтобы избежать дублирования кода конструктора в нескольких конструкторах. В конечном счете, хотя вызываемые конструкторы вызовут конструктор в базовом классе.
Надеюсь, это было понятно.
Ответ 5
Совершенно верно. Вызов Constructor Chaining, и он использовал, чтобы обойти тот факт, что С# не имеет возможности делать аргументы по умолчанию.
Это много используется в IoC.
Ответ 6
Вот так, если я не ошибаюсь:
public MyClass(SomeArg arg) : this(new SomethingElse(), arg)
вызовет
public MyClass(SomethingElse arg, SomeArg arg1) : base or this or nothing
и это будет продолжаться, пока вы не получите базу или ничего.
Если у вас есть base(....)
, то этот конструктор, имеющий это, вызывается базовым конструктором с параметрами (если таковые имеются), которые, в свою очередь, могут делегировать его собственным конструкторам (той же игре).
Если у вас ничего нет, тогда конструктор без параметров без базового класса вызывается автоматически.
После того, как вы использовали this(....)
, будет использован конструктор, соответствующий параметрам, и его тело будет выполнено - дополнительно к телу конструктора, который использовал this(....)
.
Ответ 7
Да, вы правы. Этот синтаксис используется для того, чтобы ваши конструкторы подкласса явно вызывали соответствующий конструктор нестандартного базового класса, а не по умолчанию. Это ключевое слово в вашем вопросе объясняется:
Еще одно использование этого ключевого слова - заставить один конструктор вызвать другой, чтобы избежать избыточной логики инициализации элемента.
в Pro С# 2005 и платформе .NET 2.0, 3rd Edition
Эндрю Троелсен