Исключение переполнения стека - почему? - PullRequest
5 голосов
/ 22 января 2012

Я получаю исключение переполнения стека с этим. Я сузил его до этого класса, чтобы попытаться выяснить, что было не так, но я просто понятия не имею, почему я продолжаю получать это сообщение об ошибке? Первоначально у меня был пользовательский интерфейс в другом классе, но просто чтобы устранить все остальное, например проблемы в моих вызывающих методах, я переместил основы в этот класс, чтобы попытаться выяснить, что было не так. Я думал, что это могут быть мои свойства? Может быть, это очевидно для всех остальных, но я просто не понимаю.

Поскольку я очень новичок в программировании, я был бы признателен за помощь в том, что я сделал неправильно. Из того, что я понимаю, эта проблема возникает, когда у вас есть что-то вроде бесконечного цикла?

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);          
        }
    }
}

Ответы [ 6 ]

7 голосов
/ 22 января 2012

В конструкторе Customers вы снова вызываете конструктор Customers, создавая бесконечную рекурсию.

У вас должен быть отдельный класс для списка Клиентов и для одного Клиента:

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);          
        }
    }
}
3 голосов
/ 22 января 2012

Вы вызываете создание нового объекта Customers в конструкторе Customers.

2 голосов
/ 22 января 2012

Ваш конструктор для клиентов вызывает себя, вызывая бесконечный цикл.

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

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

Бесконечные рекурсивные вызовы функции вызовут StackOverFlow.

1 голос
/ 22 января 2012
Ошибки переполнения стека

обычно происходят не из-за бесконечных циклов, а из-за бесконечной рекурсии (ну, на самом деле, на практике это не бесконечно, он продолжает вызывать себя до тех пор, пока стек не заполнится, а затем выдается исключение).

Если у вас есть метод, который использует рекурсию (то есть он вызывает себя), вы должны убедиться, что это происходит только ограниченное количество раз.Если вы этого не сделаете, вы получите метод, который вызывает себя с помощью вызова метода, который вызывает себя с помощью вызова метода, который вызывает себя с помощью вызова метода, который вызывает сам себя (продолжайте это много раз, пока стек не заполнится).... Как Клиенты () звонят Клиенты () звонят Клиенты () звонят Клиенты () звонят Клиенты () звонят Клиенты () звонят Клиенты () звонят Клиенты () .....

1 голос
/ 22 января 2012

Ваш конструктор вызывает себя (new Customers ()), что приводит к тому, что он никогда не возвращается.

Хорошее практическое правило: если вы получаете переполнение стека в C #, ищите рекурсию, которая никогда не заканчивается.

1 голос
/ 22 января 2012

Вы создаете экземпляр List в конструкторе вашего класса Customers. Это приведет к бесконечному циклу и переполнению стека.

Я думаю, вы должны попытаться разделить ваш код на несколько классов.

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()
}
...