10
votes

Comment appeler constructeur dans la classe?

Je veux appeler constructeur à l'intérieur de la classe comme: Classe publique MyClass () {

   public MyClass(){
      //......
   }

   public MyClass(int id):this(){
      //......
   }

   private void Reset(){
      //.....
      this = new MyClass(id);    //here I want to call constructor
      //......
   }
}

c#

1 commentaires

Pourquoi voudriez-vous faire cela? Vous ne pouvez pas modifier le bouton CE de cette manière à l'intérieur d'une méthode d'instance, ni de votre choix.


5 Réponses :


3
votes

Non, cela n'est pas possible. Vous ne pouvez pas attribuer à cela.

Vous pouvez cependant laisser réinitialiser () code> renvoyer une nouvelle instance de myClass code> afin que le code de l'appelant puisse dire: p>

public class MyClass
{
    public MyClass Reset()
    {
        return new MyClass();
    }
}

MyClass c = new MyClass();
c = c.Reset();


4 commentaires

J'aime l'idée de réinitialiser () renvoyer une nouvelle instance, dans ce cas devrait probablement être statique .


Si une nouvelle instance a été renvoyée, cela ne réinitialise plus rien. Cela renvoie une instance fraîchement créée de la classe. Genre de trompeur.


True, peut-être créer () serait un meilleur nom de méthode.


@JamesMichaelhare - Sauf si vous créez une usine d'objet, vous devriez vraiment utiliser de nouvelles ... ce qui rend cette suggestion un peu redondante.



16
votes

réponse simple: vous ne pouvez pas.

Réponse légèrement plus compliquée: déplacez votre logique d'initialisation dans une méthode distincte pouvant être appelée à partir du constructeur et de votre réinitialiser () méthode: xxx


1 commentaires

Ceci est parfaitement succinct et clair et a aidé ma propre compréhension immensément.



2
votes

vous peut appelez un constructeur pour votre classe à l'intérieur de votre classe (en fait cela se fait souvent avec des méthodes d'usine): xxx

mais vous ne pouvez pas changer La valeur du Cette référence à l'intérieur de la classe. Vous devez plutôt avoir votre méthode "Réinitialiser ()" Définissez les champs à leurs valeurs par défaut.


0 commentaires

13
votes

Vous ne pouvez pas. Mais ce que vous pouviez faire est de scinder la logique du constructeur en une méthode d'initialisation que la réinitialisation pourrait appeler.

   public MyClass(){
   //......
   }

   public MyClass(int id):this(){
      Initialize(id);
   }

   private void Initialize(int id){
   //....
   }

   private void Reset(){
      //.....
      Initialize(id);
      //......
   }
}


0 commentaires

1
votes

Dans une classe, vous ne pouvez pas réaffecter ceci (bien qu'il soit à noter que dans une structure, c'est parfaitement légal). La question, cependant, est de savoir si vous devriez . Je suppose que votre objectif est de définir toutes les valeurs de champ à un état spécifique, de sorte que d'autres personnes ont déjà dit que vous puissiez avoir votre méthode de réinitialisation renvoyer une nouvelle instance ou vous pouvez séduire votre logique dans une méthode claire () et appelez-la. à la place.


0 commentaires