2011-09-30 5 views
5

J'ai une classe User. L'une des propriétés doit être un utilisateur "associé", son type doit donc être Utilisateur. À l'heure actuelle, lorsque j'initialise la classe, j'obtiens un débordement de pile lors de l'initialisation de la propriété Associated. Code actuel:Initialisation d'une nouvelle classe dans son propre constructeur

public class User { 
    public User() { 
     this.Associated = new User(); 
    } 

    public User Associated { get; set; } 
} 

Est-ce faisable ou suis-je aboyer le mauvais arbre?

+1

Pourquoi la valeur null ne peut-elle pas être une valeur par défaut valide pour votre utilisateur associé? – user957902

+0

Il existe d'autres valeurs par défaut dans la classe User associée dont j'ai besoin, même pour un utilisateur non associé. –

Répondre

4

Vous pouvez utiliser une méthode chargée paresseuse pour votre classe User agrégée et non l'initialiser dans le constructeur:

public class User { 
    private User _user; 

    public User Associated 
    { 
     get 
     { 
      if (_user == null) 
       _user = new User(); 
      return _user; 
     } 
    } 
} 
+0

Accepté pour me donner la solution de contournement dont j'avais besoin. Merci. –

1

N'initialisez pas le membre associé dans le constructeur. Si vous ne l'initialisez que lorsque vous en avez besoin, je pense que le débordement de la pile devrait disparaître.

2

Vous appelez le constructeur User récursivement. Chaque fois que vous new un User, il new s un autre User ad infinitum (ou plutôt, annonce StackOverflowException).

1

Le problème est que vous avez développé une boucle sans fin de nouveaux utilisateurs. Chaque nouvel utilisateur obtient un nouvel utilisateur en tant qu'associé. Je voudrais supprimer l'affectation du constructeur par défaut, puis l'ajouter en tant que propriété publique. Cela vous permettra de contrôler quand les associés sont assignés, et empêchera la boucle sans fin.

8

Est-ce que User.Associated doit être rempli en construction? Si vous supprimez l'affectation du constructeur, vous ne devriez pas obtenir SO.

La raison pour laquelle vous obtenez un SO est que lorsque vous construisez un User(), il construit un User() qui à son tour construit un User() et il tortue tout le long.

+1

+1 pour une bonne réponse et l'analogie des tortues! –

1

appeler le constructeur dans le constructeur vous mène à une boucle infinie:

Créer une new User instance -> Créer une nouvelle instance User -> Créer une nouvelle instance User -> Créer une nouvelle instance User -> Créer une nouvelle instance User -> Créer une nouvelle User exemple ...

Vous pourriez faire quelque chose comme ça:

public class User { 
    public User() { 

    } 

    public AddAssociatedUser() { 
     this.Associated = new User(); 
    } 

    public User Associated { get; set; } 
} 

Et appelez le AddAssociatedUser quand vous en avez besoin.

Questions connexes