Порядок вычисления конструктора также должен учитываться при построении цепочки конструкторов:
Немного позаимствовал из ответа Гишу (чтобы код оставался похожим):
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
(просто для использования видимости в качестве идентификатора).