代码运行遇Stack overflow错误,C#狗狗管理系统求助排查
解决C#狗狗管理系统的Stack Overflow错误
核心问题定位
你遇到的Stack Overflow错误根源是Dog类的属性实现逻辑错误。每个属性的get/set方法都直接访问属性本身,导致无限递归调用:
- 比如
Name属性的get方法返回Name,会再次触发get方法,循环往复直到栈空间耗尽; set方法里执行Name = value,同样会再次触发set方法,形成无限循环。
错误日志里重复26万次调用Dog.set_Name就是这个原因。
修正后的Dog类代码
你有两种可靠的修正方式:
方式1:使用C#自动属性(推荐)
自动属性会由编译器自动生成幕后私有存储字段,避免手动写递归逻辑:
public class Dog { // 自动属性,编译器自动处理字段存储 public string Name { get; set; } public string Breed { get; set; } public int Age { get; set; } public string Vaccine { get; set; } // 默认构造函数 public Dog() { Name = "N/A"; Breed = "N/A"; Age = -1; // 原代码里的string[] vaccine是局部变量,无实际作用,建议删除 } // 带参构造函数 public Dog(string name, string breed, int age, string vaccine) { Name = name; Breed = breed; Age = age; Vaccine = vaccine; } // 修正AddVaccine方法,实现实际追加疫苗的逻辑(原方法仅返回参数,无意义) public void AddVaccine(string vaccine) { // 已有疫苗则用逗号分隔追加,无疫苗则直接赋值 Vaccine = string.IsNullOrEmpty(Vaccine) ? vaccine : $"{Vaccine}, {vaccine}"; } }
方式2:手动定义私有存储字段
如果需要明确控制字段逻辑,可以手动添加私有存储字段:
public class Dog { // 私有字段存储属性值 private string _name; private string _breed; private int _age; private string _vaccine; public string Name { get { return _name; } set { _name = value; } } public string Breed { get { return _breed; } set { _breed = value; } } public int Age { get { return _age; } set { _age = value; } } public string Vaccine { get { return _vaccine; } set { _vaccine = value; } } // 构造函数和AddVaccine方法同方式1 public Dog() { Name = "N/A"; Breed = "N/A"; Age = -1; } public Dog(string name, string breed, int age, string vaccine) { Name = name; Breed = breed; Age = age; Vaccine = vaccine; } public void AddVaccine(string vaccine) { Vaccine = string.IsNullOrEmpty(Vaccine) ? vaccine : $"{Vaccine}, {vaccine}"; } }
其他代码优化建议
除核心错误外,还有几个小问题可以优化:
- 删除狗狗逻辑:原代码中
if (!removed)的提示会在循环每次迭代时打印,应移到循环外,只判断一次:
case 2: Console.Write("Enter the dog name:"); string dogName = Console.ReadLine(); bool removed = false; for(int i = 0; i < dogs.Length; i++) { Dog dog = dogs[i]; if(dog != null && dog.Name == dogName) { dogs[i] = null; // 直接赋值即可,无需中间变量 removed = true; Console.WriteLine("{0} was successfully removed", dogName); break; } } // 移到循环外,仅执行一次判断 if (!removed) { Console.WriteLine("{0} was not found", dogName); } break;
- 添加疫苗逻辑:
Console.ReadLine()永远不会返回null,只会返回空字符串,应修改判断逻辑:
if(string.IsNullOrEmpty(vac)) { Console.WriteLine("Vaccine not added"); }
同时建议使用修正后的AddVaccine方法追加疫苗,而非直接覆盖原有值:
dog.AddVaccine(vac);
内容的提问来源于stack exchange,提问作者user19888755
相关产品推荐
相关产品推荐

