Подтвердить что ты не робот

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

Мне нужно вызвать один конструктор из тела другого, как это сделать?

В основном

class foo {
    public foo (int x, int y)
    {
    }

    public foo (string s)
    {
        // ... do something

        // call another constructor
        this (x, y); // doesn't work
        foo (x, y); // neither
    }
}
4b9b3361

Ответ 1

Вы не можете.

Вам нужно найти способ привязки конструкторов, например:

public foo (int x, int y) { }
public foo (string s) : this(XFromString(s), YFromString(s)) { ... }

или переместите код построения в общий способ настройки, например:

public foo (int x, int y) { Setup(x, y); }
public foo (string s)
{
   // do stuff
   int x = XFromString(s);
   int y = YFromString(s);
   Setup(x, y);
}

public void Setup(int x, int y) { ... }

Ответ 2

this(x, y) прав, но это должно быть до начала тела конструктора:

public Foo(int x, int y)
{
    ...
}

public Foo(string s) : this(5, 10)
{
}

Обратите внимание, что:

  • Вы можете только привязать к одному конструктору, либо this, либо base - этот конструктор может, конечно, привязываться к другому.
  • Вы не можете привязать конструктор после выполнения любого кода в теле конструктора.
  • Вы не можете использовать this внутри аргументов для другого конструктора, включая методы вызова экземпляра, но вы можете вызвать статические методы.
  • Все инициализаторы переменных экземпляра выполняются перед цепочным вызовом.

У меня есть немного больше информации в статье о цепочке конструктора.

Ответ 3

Чтобы вызвать конструктор base и this class явно, вам нужно использовать синтаксис, приведенный ниже (обратите внимание, что в С# вы не можете использовать его для инициализации полей, подобных на С++):

class foo
{
    public foo (int x, int y)
    {
    }

    public foo (string s) : this(5, 6)
    {
        // ... do something
    }
}

//EDIT: Заметил, что вы использовали x, y в своем примере. Конечно, значения, заданные при вызове ctor таким образом, не могут опираться на параметры другого конструктора, они должны быть разрешены другим способом (они не обязательно должны быть константами, как в отредактированном примере кода выше). Если x и y вычисляются из s, вы можете сделать это следующим образом:

public foo (string s) : this(GetX(s), GetY(s))

Ответ 4

Это не поддерживается - см. http://www.yoda.arachsys.com/csharp/constructors.html.

Однако вы можете реализовать общий (закрытый) метод, который вы вызываете из разных конструкторов...

Ответ 5

Я столкнулся с этой проблемой время или два сам... то, что мне пришлось сделать, это извлечь любую логику, которая мне нужна в этом другом конструкторе, в метод private void и вызвать ее в обоих местах.

class foo
{
  private void Initialize(int x, int y)
  {
    //... do stuff
  }

  public foo(int x, int y)
  {
    Initialize(x, y);
  }

  public foo(string s_
  {
    // ... do stuff

    Initialize(x, y)
    // ... more stuff
  }
}