Подтвердить что ты не робот

: этот (foo) синтаксис в конструкторах С#?

Время от времени я сталкиваюсь с синтаксисом, который я видел раньше, но никогда не использовал. Это один из тех случаев.

Может кто-нибудь объяснить цель ": this" или ": base" после метода конструктора С#?

Например:

public MyClass(SomeArg arg) : this(new SomethingElse(), arg)
{
}

Я чувствую, что он используется для сопоставления аргумента по умолчанию другому методу конструктора.

4b9b3361

Ответ 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 Эндрю Троелсен