Почему я получаю StackOverflowException? - PullRequest
0 голосов
/ 14 апреля 2020
class Program
{
    static void Main(string[] args)
    {
        //Declare Variables
        string name;
        string breed;
        string colour;
        string gender;
        string userChoice;
        bool proceed;

        //Initialize Variables
        name = "";
        breed = "";
        colour = "";
        gender = "";
        proceed = true;
        numberOfDogs = 0;

        Dogs dogList = new Dogs();

        do
        {
            Console.Write("Main Menu\n");
            Console.WriteLine("--------------------------------------------------------");
            Console.WriteLine("1.   Display the name, breed, colour, and gender of the dog (if one already exists)");
            Console.WriteLine("2.   Add a new dog");
            Console.WriteLine("3.   Edit an existing dog");
            Console.WriteLine("4.   Exit the program");
            userChoice = Console.ReadLine();

            switch (userChoice)
            {
                case "A":
                case "a":
                    {
                        dogList.Display();
                        break;
                    }
                case "B":
                case "b":
                    {
                        Console.Clear();
                        Console.Write("Please enter the dog's name: ");
                        name = Console.ReadLine();
                        Console.Write("Please enter the breed of the dog: ");
                        breed = Console.ReadLine();
                        Console.Write("Please enter the colour of the dog: ");
                        colour = Console.ReadLine();
                        Console.Write("Please enter the dog's gender: ");
                        gender = Console.ReadLine();
                        dogList = new Dogs(name, breed, colour, gender);
                        break;
                    }
                case "C":
                case "c":
                    {
                        dogList.Display();
                        dogList = new Dogs();
                        break;
                    }
                case "D":
                case "d":
                    {
                        proceed = false;
                        break;
                    }
                }
            } while (proceed);
        } 
    }
}

У меня был другой код, который я использовал, но мой учитель хотел, чтобы я его настроил. Когда я показал ее пример, он сказал то же самое ... Кто-нибудь знает, в чем проблема?

Я просмотрел это несколько раз, и я не могу понять это. Я абсолютный новичок в программировании, поэтому иногда очень трудно решать проблемы ... Я отправил электронное письмо учителю, чтобы сообщить ей об этом примере, но она еще не ответила мне. Если бы кто-то мог помочь мне, я был бы очень признателен!

class Dogs
{
    //Declare Dog Variables
    string name;
    string breed;
    string colour;
    string gender;

    public Dogs()
    {
        name = null;
        breed = null;
        colour = null;
        gender = null;
        Dogs dogList = new Dogs();
    }
    public Dogs(string dogName, string dogBreed, string dogColour, string dogGender)
    {
        name = dogName;
        breed = dogBreed;
        colour = dogColour;
        gender = dogGender;
    }
    public void Display()
    {
        if (name == null || breed == null || colour == null || gender == null)
        {
            Console.Write("No dog record exists");
        }
        else
        {
            Console.WriteLine("The dogs name is: " + name);
            Console.WriteLine("The breed of the dog is: " + breed);
            Console.WriteLine("The colour of the dog is: " + colour);
            Console.WriteLine("The dogs gender is: " + gender);
        }
    }
}

}

1 Ответ

1 голос
/ 14 апреля 2020

С этими строками кода:

class Dogs
{ 
    public Dogs()
    {
        // ...
        Dogs dogList = new Dogs();
    }
}

вы создаете рекурсивный вызов того же конструктора Dog, который будет продолжаться до тех пор, пока не будет выделено больше доступной памяти для вашего C# программа.

Когда это произойдет, будет выдано исключение StackOverflow.


Чтобы добиться аналогичного поведения, вы можете сделать это:

public interface IDog
{
}

public class Dog : IDog
{
    public List<IDog> DogsList { get; set; }

    public string Name { get; set; }

    public Dog()
    {
        // other initialization logic here
    }
}

и позже использовать это следующим образом:

var dog = new Dog
{
    Name = "Scooby",
    DogsList = new List<IDog>
    {
        {new Dog() {Name = "Do"}}
    }
};

Console.WriteLine($"Main dog={dog.Name}");

foreach (var dog1 in dog.DogsList)
{
    Console.WriteLine($"Living together with: {dog.Name}");
}

или даже проще, просто используйте один класс Dog и создайте список из Dog с:

public class Dog { 
}

...

var dogList = new List<Dog>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...