2012-01-22 27 views
5

Sigo recibiendo una excepción de desbordamiento de pila con esto. Lo he reducido a esta clase para tratar de averiguar lo que estaba mal pero simplemente no tengo idea de por qué sigo recibiendo este mensaje de error. Originalmente tengo la interfaz de usuario en otra clase, pero para eliminar todo lo demás, como problemas en mis métodos de llamada, moví los elementos esenciales a esta clase para tratar de descubrir qué estaba mal. Pensé que podrían ser mis propiedades? Tal vez sea obvio para todos los demás, pero simplemente no entiendo.Excepción de desbordamiento de pila: ¿por qué?

Como soy muy nuevo en la programación, agradecería algo de ayuda sobre lo que he hecho mal. Por lo que entiendo, ¿este problema ocurre cuando tienes algo así como un ciclo infinito?

namespace MyNameSpace 
{ 
    public class Customers 
    { 
     private List<Customers> customers; 

     public Customers() 
     { 
      customers = new List<Customers>(); 

      AddCustomer(new Customers() 
      { 
      Name = "A", Telephone="1" 
      }); 
     } 

     public string Name 
     { 
      get; 
      set; 
     } 
     public string Telephone 
     { 
      get; 
      set; 
     } 

     public void RunTest() 
     { 

      Console.WriteLine(); 
      Console.WriteLine("****** VIDEOSTORE ******"); 
      Console.WriteLine(); 
      Console.WriteLine("1. Show Customers"); 
      Console.WriteLine("6. Quit"); 

      string userChoice = Console.ReadLine(); 

      switch (userChoice) 
      { 
       case "1": 
        View(); 
        break;   

        break; 
       case "2": 
        break; 
      } 
     } 

     public void View() 
     { 
      foreach (Customers c in customers) 
      { 
       Console.WriteLine(); 
       Console.WriteLine(c.Name); 
       Console.WriteLine(c.Telephone); 
       Console.WriteLine(); 
      } 
     } 

     public void AddCustomer(Customers custom)       
     { 
      customers.Add(custom);   
     } 
    } 
} 
+0

¿Por qué tiene todo en un clase individual? – BoltClock

+0

Porque traté de descubrir qué estaba mal y moví lo esencial a esta clase para tratar de eliminar otros métodos y cosas en las otras clases. – user1153537

+1

+1 ¡Porque es una excepción de Stackoverflow! – DGund

Respuesta

3

Está llamando a su creación de un nuevo objeto Clientes en el constructor Clientes.

+0

Buen descubrimiento. También estaba buscando una recursión infinita. –

+0

El asunto es que quiero iniciar una lista que contenga varios objetos y luego agregar clientes a esta lista y no sé cómo hacer para que la lista se actualice con los nuevos clientes a menos que de alguna manera los configure en el constructor. – user1153537

+0

¿Hay alguna manera de agregar los Clientes predeterminados dentro del constructor y establecer las propiedades como Nombre allí? – user1153537

1

Está creando una lista dentro del constructor de su clase Customers. Esto causará un bucle infinito y dará como resultado un desbordamiento de la pila.

Creo que deberías tratar de separar tu código en varias clases.

public class Customer 
{ 
    public string Name { get; set; } 
    public string Telephone { get; set; } 
} 

public class Program 
{ 
    private List<Customer> _customers = new List<Customer(); 

    public Program() 
    { 
     _customers.Add(new Customer() 
     { 
      Name = "A", Telephone="1" 
     }); 
    } 

    // your other methods here - like View() 
} 
7

En el constructor Clientes llama al constructor Clientes nuevamente, creando una recursión infinita.

usted debe tener una clase separada para obtener una lista de los clientes y para un solo cliente:

namespace MyNameSpace 
{ 
    public class Customer 
    { 
     public string Name 
     { 
      get; 
      set; 
     } 
     public string Telephone 
     { 
      get; 
      set; 
     } 
    } 

    public class Customers 
    { 
     private List<Customer> customers; 

     public Customers() 
     { 
      customers = new List<Customer>(); 

      AddCustomer(new Customer() 
      { 
      Name = "A", Telephone="1" 
      }); 
     } 


     public void RunTest() 
     { 

      Console.WriteLine(); 
      Console.WriteLine("****** VIDEOSTORE ******"); 
      Console.WriteLine(); 
      Console.WriteLine("1. Show Customers"); 
      Console.WriteLine("6. Quit"); 

      string userChoice = Console.ReadLine(); 

      switch (userChoice) 
      { 
       case "1": 
        View(); 
        break;   

        break; 
       case "2": 
        break; 
      } 
     } 

     public void View() 
     { 
      foreach (Customer c in customers) 
      { 
       Console.WriteLine(); 
       Console.WriteLine(c.Name); 
       Console.WriteLine(c.Telephone); 
       Console.WriteLine(); 
      } 
     } 

     public void AddCustomer(Customer customer)       
     { 
      customers.Add(customer);   
     } 
    } 
} 
+0

¡Muchas gracias! – user1153537

1

Su constructor está llamando a sí mismo (nuevos clientes()), lo que hace que no volver nunca.

Una buena regla general, si obtiene un desbordamiento de pila en C#, busque recursividad que nunca termina.

+0

¿Hay alguna manera de iniciar la lista de clientes predeterminados en el constructor y establecer propiedades como Nombre para los clientes predeterminados? Más tarde quiero poder agregar clientes a la lista y así obtener la lista para actualizar y no sé cómo hacer esto si no inicializo la lista en el constructor. – user1153537

2

Su constructor para clientes se llama a sí mismo, causando un bucle infinito.

public Customers() 
{ 
    customers = new List<Customers>(); 

    AddCustomer(new Customers() // <- Here 
    { 
    Name = "A", Telephone="1" 
    }); 
} 

Las llamadas recursivas interminables a una función causarán un StackOverFlow.

1

Los errores de desbordamiento de pila generalmente no provienen de bucles infinitos, sino de recurrencia interminable (bueno, no realmente interminable en la práctica, continúa llamándose hasta que la pila está llena y luego se lanza la excepción).

Si tiene un método que usa recursividad (es decir, se llama a sí mismo), debe asegurarse de que esto solo suceda un número limitado de veces. Si no haces eso, obtienes un método que se llama a sí mismo con una llamada a método que se llama a sí misma con una llamada a método que se llama a sí misma con una llamada a método que se llama a sí misma (continúa muchas veces hasta que la pila esté llena). ... Al igual que Clientes() Llamar Clientes() Llamar Clientes() Llamar Clientes() Llamar Clientes() Llamar Clientes() Llamar Clientes() Llamar Clientes() .....

Cuestiones relacionadas