: этот (foo) синтаксис в конструкторах C #? - PullRequest
16 голосов
/ 03 декабря 2008

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

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

Например:

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

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

Ответы [ 7 ]

19 голосов
/ 03 декабря 2008

Ваше внутреннее чувство верно. Синтаксис используется для вызова перегруженных конструкторов в одном классе:

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) используется для вызова базовых конструкторов.

19 голосов
/ 03 декабря 2008

Ты в принципе прав. this() вызывает конструктор в текущем экземпляре, base() вызывает конструктор супертипа в текущем экземпляре. Они обычно используются для обработки перегрузок конструктора, поэтому вы можете добавлять дополнительные опции, не разбивая их на отдельные методы.

4 голосов
/ 03 декабря 2008

Ты прав.

: base (...) вызывает конструктор базового класса.

: this (...) вызывает другой конструктор определяющего класса. Большую часть времени он работает просто как фасад.

3 голосов
/ 03 декабря 2008

Каждый конструктор в классе .NET гарантирует, что конструктор в классе, от которого он наследуется, также вызывается.

Так что, если у вас есть следующие классы:

public class Base { }
public class Something : Base { }
public class Else : Something { }

тогда конструктор в Else вызовет конструктор в Something, который также вызовет конструктор в Base.

Конструктор, вызываемый в базовом классе (т. Е. Тот, от которого вы спускаетесь), всегда является конструктором без параметров.

Если у вас его нет или вы хотите его переопределить, вы можете переопределить его, указав base (некоторые параметры здесь). Это выберет правильный конструктор в базовом классе.

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

Надеюсь, это было понятно.

2 голосов
/ 03 декабря 2008

Да, вы правы. Этот синтаксис используется для того, чтобы ваши конструкторы подкласса явно вызывали соответствующий пользовательский конструктор базового класса, а не по умолчанию. Это ключевое слово в вашем вопросе объяснено:

Другое использование этого ключевого слова - заставить один конструктор вызывать другой, чтобы избежать избыточной логики инициализации члена.

в Pro C # 2005 и платформе .NET 2.0, 3-е издание Эндрю Троелсен

2 голосов
/ 03 декабря 2008

Это так, если я не ошибаюсь:

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

позвонит

public MyClass(SomethingElse arg, SomeArg arg1) : base or this or nothing

и так будет до тех пор, пока вы не получите базу или ничего.

Если у вас есть base(....), то этот конструктор, имеющий его, вызовет базовый конструктор с заданными параметрами (если они есть), которые, в свою очередь, могут делегировать его собственным конструкторам (та же игра).

Если у вас ничего нет, то конструктор базового класса без параметров вызывается автоматически.

После того, как вы использовали this(....), будет использован конструктор, соответствующий параметрам, и будет выполнено его тело - в дополнение к телу конструктора, использовавшего this(....).

2 голосов
/ 03 декабря 2008

Точно. Назовите его Constructor Chaining, и он используется для того, чтобы обойти тот факт, что C # не может использовать аргументы по умолчанию.

Это часто используется в IoC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...