2011-09-30 17 views
5

Tengo una clase de usuario. Una de las propiedades debe ser un usuario "asociado", por lo que su tipo debe ser Usuario. Ahora mismo cuando inicializo la clase, obtengo un desbordamiento de la pila cuando intenta inicializar la propiedad Asociada. Código actual:Inicializando una nueva clase en su propio constructor

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

    public User Associated { get; set; } 
} 

¿Esto es factible o estoy ladrando en el árbol equivocado?

+1

¿Por qué no puede nulo ser un valor predeterminado válido para su usuario asociado? – user957902

+0

Existen otros valores predeterminados en la clase de Usuario asociado que necesito, incluso para un Usuario no asociado. –

Respuesta

4

Se puede usar un método de carga perezosa para su agregada clase User y no inicializar en el constructor:

public class User { 
    private User _user; 

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

Aceptado por darme la solución que necesitaba. Gracias. –

1

No inicialice el miembro asociado en el constructor. Si solo lo inicializas cuando lo necesitas, creo que el desbordamiento de pila debería desaparecer.

2

Está llamando al constructor User de forma recursiva. Cada vez que new a User, es new s otro User ad infinitum (o más bien, anuncio StackOverflowException).

1

El problema es que ha desarrollado un bucle sin fin de nuevos usuarios. Cada nuevo usuario obtiene un nuevo usuario como asociado.

Quitaría la asignación del constructor predeterminado y luego lo agregaría como propiedad pública. Hacer esto le permitirá controlar cuándo se asignan los asociados, y evitará el ciclo sin fin.

8

¿El usuario.Asociado debe ser rellenado en la construcción? Si elimina la asignación del constructor, no debería obtener SO.

La razón de que está recibiendo un SO es porque cuando se construye un User() construye un User() que a su vez construye un User() y es tortugas hasta el fondo.

+1

+1 para una buena respuesta y la analogía de las tortugas! –

1

llamando al constructor dentro del constructor que lleva a un bucle infinito:

Crear una nuevo User instancia -> Crear una nueva instancia de User -> Crear una nueva instancia de User -> Crear una nueva instancia de User -> Crear una nueva instancia de User -> Crear una nueva,210 ejemplo ...

Usted podría hacer algo así:

public class User { 
    public User() { 

    } 

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

    public User Associated { get; set; } 
} 

y llamar a la AddAssociatedUser cuando lo necesite.

Cuestiones relacionadas