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

C#中IF与ELSE语句同时执行的问题排查求助

宠物诊所控制台应用逻辑错误修复

问题现象

创建主人对象后,使用该主人名称添加宠物时,控制台同时输出以下两个内容:

  • Owner does not exist.
  • Pet [宠物名] added to owner [主人名] successfully.

核心错误原因

  1. Owner类的列表设计错误:每个Owner实例都维护独立的owners集合,业务逻辑上所有主人应该共享同一个全局列表,而非每个主人自身存储一份。当通过FindOwnerByName获取到目标主人后,该主人实例的owners列表是空的(每个Owner构造时都会初始化新的空列表)。
  2. Pet类的判断逻辑错误:CreatePet方法中!owner.owners.Contains(owner)的判断毫无意义,它检查的是目标主人自己的列表是否包含自己,而非验证该主人是否存在于全局主人列表中。

代码修复方案

1. 重构Owner类(将主人列表改为静态)

namespace Pet_Clinic.Model
{
    public class Owner
    {
        public string belongsTo { get; set; }
        public string Address { get; set; }
        public string PhoneNumber { get; set; }
        public string Email { get; set; }

        // 改为静态列表,所有Owner实例共享同一个主人集合
        public static List<Owner> owners = new List<Owner>();

        public Owner()
        {
            // 静态列表无需在构造函数中重复初始化
        }

        public override string ToString()
        {
            return $"{belongsTo} - {Address} - {PhoneNumber} - {Email}";
        }

        public void CreateOwner(string name, string address, string email, string phonenumber)
        {
            Owner newOwner = new Owner()
            {
                belongsTo = name,
                Address = address,
                Email = email,
                PhoneNumber = phonenumber,
            };
            owners.Add(newOwner);
        }

        public Owner FindOwnerByName(string ownerName)
        {
            // 使用Linq简化查找逻辑,也可以保留原foreach写法
            return owners.FirstOrDefault(owner => owner.belongsTo == ownerName);
        }
    }
}

2. 修正Pet类的CreatePet方法

namespace Pet_Clinic.Model
{
    public class Pet
    {
        public string Name { get; set; }
        public string Breed { get; set; }
        public int Age { get; set; }
        public Owner Owner { get; set; }

        public List<Pet> petList = new List<Pet>();

        public override string ToString()
        {
            return $"Name: {Name} Breed: {Breed} Age: {Age} Owner: {Owner}";
        }

        public void CreatePet(string name, string breed, int age, Owner owner)
        {
            // 主方法中已验证owner不为null,若需双重验证则检查全局静态列表
            if (!Owner.owners.Contains(owner))
            {
                Console.WriteLine("Owner does not exist.");
                return;
            }

            Pet newPet = new Pet
            {
                Name = name,
                Breed = breed,
                Age = age,
                Owner = owner,
            };
            petList.Add(newPet);
        }
    }
}

3. 可选:优化主方法的输入容错

避免因输入非数字导致程序崩溃,替换int.Parse为int.TryParse:

// 替换主方法中获取选项的代码段
Console.Write("Pick an option: ");
int choice;
if (!int.TryParse(Console.ReadLine(), out choice))
{
    Console.WriteLine("请输入有效的数字选项。");
    Console.Write("Press enter to return to menu: ");
    Console.ReadLine();
    continue;
}

修复后效果

创建主人并添加宠物时,控制台只会输出成功提示,不会再出现错误的"Owner does not exist."信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:22:03