Вызов конструктора из другого конструктора в том же классе

У меня есть класс с 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 (просто для использования видимости в качестве идентификатора).