Можно ли вызвать перегруженный конструктор из другого конструктора того же класса в C #? - PullRequest
185 голосов
/ 12 июня 2009

Можно ли вызвать перегруженный конструктор из другого конструктора того же класса в C #?

Ответы [ 4 ]

220 голосов
/ 12 июня 2009

Нет, вы не можете этого сделать, единственное место, где вы можете вызвать конструктор из другого конструктора в C #, это сразу после ":" после конструктора. например

class foo
{
    public foo(){}
    public foo(string s ) { }
    public foo (string s1, string s2) : this(s1) {....}

}
77 голосов
/ 12 июня 2009

Если вы имеете в виду, если вы можете сделать цепочку ctor в C #, ответ - да. Вопрос уже задан.

Однако, как видно из комментариев, кажется, что вы действительно хотите спросить «Можно ли вызвать перегруженный конструктор из в другого конструктора с предварительной / постобработкой?»
Хотя C # не имеет синтаксиса для этого, вы можете сделать это с помощью обычной функции инициализации (как в C ++, которая не поддерживает цепочку ctor)

class A
{
  //ctor chaining
  public A() : this(0)
  {  
      Console.WriteLine("default ctor"); 
  }

  public A(int i)
  {  
      Init(i); 
  }

  // what you want
  public A(string s)
  {  
      Console.WriteLine("string ctor overload" );
      Console.WriteLine("pre-processing" );
      Init(Int32.Parse(s));
      Console.WriteLine("post-processing" );
  }

   private void Init(int i)
   {
      Console.WriteLine("int ctor {0}", i);
   }
}
37 голосов
/ 12 июня 2009

РЕДАКТИРОВАТЬ: Согласно комментариям к исходному сообщению, это вопрос C #.

Краткий ответ: да, используется ключевое слово this.

Длинный ответ: да, используется ключевое слово this, и вот пример.

class MyClass
{
   private object someData;

   public MyClass(object data)
   {
      this.someData = data;
   }

   public MyClass() : this(new object())
   {
      // Calls the previous constructor with a new object, 
      // setting someData to that object
   }
}
4 голосов
/ 12 июня 2009

В C # невозможно вызвать другой конструктор из тела метода. Вы можете вызвать базовый конструктор следующим образом: foo (args): base (), как указано самим. Вы также можете вызвать другой конструктор из того же класса: foo (args): this ().

Когда вы хотите что-то сделать перед вызовом базового конструктора, кажется, что конструкция базы является классом, зависящим от некоторых внешних вещей. Если это так, вы должны использовать аргументы базового конструктора, а не устанавливать свойства базового класса или что-то в этом роде

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