Вызов конструктора из другого конструктора того же класса - PullRequest
134 голосов
/ 06 мая 2009

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

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

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

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

Ответы [ 3 ]

213 голосов
/ 06 мая 2009

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

31 голосов
/ 06 мая 2009

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

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

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

    }
}
13 голосов
/ 29 марта 2016

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...