You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

代码运行遇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}";
    }
}

其他代码优化建议

除核心错误外,还有几个小问题可以优化:

  1. 删除狗狗逻辑:原代码中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;
  1. 添加疫苗逻辑:Console.ReadLine()永远不会返回null,只会返回空字符串,应修改判断逻辑:
if(string.IsNullOrEmpty(vac))
{
    Console.WriteLine("Vaccine not added");
}

同时建议使用修正后的AddVaccine方法追加疫苗,而非直接覆盖原有值:

dog.AddVaccine(vac);

内容的提问来源于stack exchange,提问作者user19888755

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:05:34