127 votes

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# ?

162voto

mfawzymkh Points 2963

Non, vous ne pouvez pas faire cela, le seul endroit où vous pouvez appeler le constructeur d'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) {....}

}

47voto

Gishu Points 59012

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

Cependant, il semble, d'après les commentaires, que ce que vous voulez vraiment demander est Puis-je appeler un constructeur surchargé à partir de sur un autre constructeur avec un pré/post traitement ?
Bien que le C# n'ait pas la syntaxe pour le faire, vous pourriez le faire avec une fonction d'initialisation commune (comme vous le feriez en C++ qui ne supporte pas 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);
   }
}

18voto

Ari Roth Points 1290

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

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

Longue réponse : oui, en utilisant le this mot-clé, 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
   }
}

2voto

JaapM Points 35

En C#, il n'est pas possible d'appeler un autre constructeur à l'intérieur du corps de la méthode. Vous pouvez appeler un constructeur de base de la manière suivante : foo(args):base() comme vous l'avez souligné vous-même. Vous pouvez également appeler un autre constructeur dans 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 classe de base dépende de certaines choses externes. Si c'est le cas, vous devez utiliser les arguments du constructeur de base, et non pas définir les propriétés de la classe de base ou quelque chose comme ça.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X