Вызов конструктора из другого конструктора в том же классе
У меня есть класс с 2 конструкторами:
public class Lens
{
public Lens(string parameter1)
{
//blabla
}
public Lens(string parameter1, string parameter2)
{
// want to call constructor with 1 param here..
}
}
Я хочу вызвать первый конструктор из второго. Возможно ли это в С#?
Ответы
Ответ 1
Добавить :this(required params)
в конце конструктора, чтобы сделать 'цепочку конструкторов
public Test( bool a, int b, string c )
: this( a, b )
{
this.m_C = c;
}
public Test( bool a, int b, float d )
: this( a, b )
{
this.m_D = d;
}
private Test( bool a, int b )
{
this.m_A = a;
this.m_B = b;
}
Источник Предоставлено csharp411.com
Ответ 2
Да, вы бы использовали следующие
public class Lens
{
public Lens(string parameter1)
{
//blabla
}
public Lens(string parameter1, string parameter2) : this(parameter1)
{
}
}
Ответ 3
Порядок конструкторской оценки также должен приниматься во внимание при создании конструкторов цепочки:
Заимствовать у Гишу ответ, немного (чтобы сохранить код несколько похожим):
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
(просто для использования видимости в качестве идентификатора).