web-dev-qa-db-fra.com

Puis-je appeler un constructeur surchargé à partir d'un autre constructeur de la même classe en C #?

Puis-je appeler un constructeur surchargé à partir d'un autre constructeur de la même classe en C #?

190
Malay

Non, vous ne pouvez pas faire cela, le seul endroit où vous pouvez appeler le constructeur depuis un autre constructeur en C # est immédiatement après ":" après le constructeur. par exemple

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

}
222
mfawzymkh

Si vous voulez dire si vous pouvez faire le chaînage de ctor en C #, la réponse est oui. La question a déjà été posée.

Cependant, il semble que d'après les commentaires, ce que vous avez réellement l'intention de demander est: "Puis-je appeler un constructeur surchargé depuis dans un autre constructeur avec traitement préalable/postérieur ? '
Bien que C # n’ait pas la syntaxe pour le faire, vous pouvez le faire avec une fonction d’initialisation commune (comme vous le feriez en C++ qui ne prend pas en charge le chaînage de 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);
   }
}
80
Gishu

EDIT: Selon les commentaires sur le post original, il s’agit d’une question C #.

Réponse courte: oui, en utilisant le mot clé this.

Réponse longue: oui, utilisez le mot clé this, et voici un exemple.

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
   }
}
37
Ari Roth

En C #, il n'est pas possible d'appeler un autre constructeur à partir du corps de la méthode. Vous pouvez appeler un constructeur de base de cette façon: foo (args): base () comme vous l’avez indiqué. Vous pouvez également appeler un autre constructeur de la même classe: foo (args): this ().

Lorsque vous voulez faire quelque chose avant d'appeler un constructeur de base, il semble que la construction de la base est classe dépend de certaines choses externes. Si c'est le cas, vous devriez utiliser les arguments du constructeur de base, et non en définissant les propriétés de la classe de base ou quelque chose du genre.

4
JaapM