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

У меня есть класс с 2 конструкторами:

public class Lens
{
    public Lens(string parameter1)
    {
        //blabla
    }

    public Lens(string parameter1, string parameter2)
    {
       // want to call constructor with 1 param here..
    }
}

Я хочу вызвать первый конструктор из второго. Возможно ли это в C #?


person Robbert Dam    schedule 06.05.2009    source источник


Ответы (3)


Добавьте :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

person Gishu    schedule 06.05.2009

Да, вы бы использовали следующие

public class Lens
{
    public Lens(string parameter1)
    {
       //blabla
    }

    public Lens(string parameter1, string parameter2) : this(parameter1)
    {

    }
}
person Matthew Dresser    schedule 06.05.2009
comment
Я думаю, что во втором конструкторе произойдет то, что вы создадите локальный экземпляр Lens, который выходит за пределы области видимости в конце конструктора и НЕ назначается ему. Вам нужно использовать синтаксис цепочки конструкторов в сообщении Гишу, чтобы добиться того, что задает вопрос. - person Colin Desmond; 06.05.2009
comment
Ага, извините за это. Исправлено сейчас. - person Matthew Dresser; 06.05.2009

Порядок вычисления конструктора также необходимо учитывать при объединении конструкторов в цепочку:

Чтобы позаимствовать из ответа Гишу, немного (чтобы код оставался похожим):

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