Порядок вычисления конструктора также необходимо учитывать при объединении конструкторов в цепочку:
Чтобы позаимствовать из ответа Гишу, немного (чтобы код оставался похожим):
public Test(bool a, int b, string c)
: this(a, b)
{
this.C = c;
}
private Test(bool a, int b)
{
this.A = a;
this.B = b;
}
Если мы немного изменим вычисление, выполняемое в конструкторе private, мы увидим, почему важен порядок конструкторов:
private Test(bool a, int b)
{
// ... remember that this is called by the public constructor
// with `this(...`
if (hasValue(this.C))
{
// ...
}
this.A = a;
this.B = b;
}
Выше я добавил фиктивный вызов функции, который определяет, имеет ли свойство C значение. На первый взгляд может показаться, что C имеет значение - оно задается в вызывающем конструкторе; однако важно помнить, что конструкторы - это функции.
this(a, b) вызывается - и должен "возвращаться" - перед выполнением тела конструктора public. Другими словами, последний вызываемый конструктор является первым вычисленным конструктором. В этом случае private оценивается перед public (просто для использования видимости в качестве идентификатора).
person
Thomas
schedule
29.03.2016