【问题标题】:Why am I getting a StackOverflowException?为什么我会收到 StackOverflowException?
【发布时间】:2020-04-14 16:35:12
【问题描述】:
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);
        }
    }
}

}

【问题讨论】:

  • 请发狗类
  • 我加了,谢谢。
  • 我认为这是由于您的构造函数中的 dogList 属性,每次创建一个时,您都会创建一个再次调用构造函数的子属性
  • 因此,当您在 ctor 中构建一个新的狗类时,您会创建另一个狗类,因此它会继续创建新的狗类,因此您有一个 stackoverflow
  • 太棒了!!!我只需要完成项目的编码,现在应该可以解决了!!非常感谢!!!

标签: c# stack-overflow


【解决方案1】:

使用这些代码行:

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 类,然后创建一个 Dogs 列表:

public class Dog { 
}

...

var dogList = new List<Dog>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2016-08-21
    • 2014-07-04
    • 2020-06-06
    • 2018-12-26
    • 2021-03-05
    相关资源
    最近更新 更多