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

C#控制台输出员工List报Stack overflow 实现PrintAllEmployees方法

问题根因

栈溢出报错由属性无限递归调用直接导致,原代码同时存在4类问题:

  • 类属性没有使用私有字段做存储,get/set块直接读写属性自身:比如companyName属性的get块直接return companyName,读取属性时会反复调用自身get方法,直到栈内存占满抛出溢出错误
  • 所有构造函数赋值方向完全写反:把空的属性值赋值给传入参数,导致实例化后所有字段都是默认空值/0
  • Main方法里创建的员工列表是方法局部变量,和Company类实例没有关联,即使不报错也无法通过Company实例打印员工
  • 未实现要求的PrintAllEmployees打印方法
修复后完整代码

Entities 命名空间代码

using System;
using System.Collections.Generic;

namespace Entities
{
    public class Person
    {
        private string name;
        private int age;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public int Age
        {
            get { return age; }
            set { age = value; }
        }
        public Person(string name, int age)
        {
            // 修正赋值方向:将传入参数赋值给属性
            Name = name;
            Age = age;
        }
    }

    public class Employee : Person
    {
        private string hireDate;

        public Employee(string name, int age, string hireDate) : base(name, age)
        {
            // 修正赋值方向
            HireDate = hireDate;
        }

        public string HireDate
        {
            get { return hireDate; }
            set { hireDate = value; }
        }
    }

   public class Company
    {
        // 为所有属性添加私有 backing field 避免递归
        private List<Person> employeesList = new List<Person>();
        private string companyName;
        private int employeeCount;

        public List<Person> EmployeesList
        {
            get { return employeesList; }
            set { employeesList = value; }
        }
        
        public string CompanyName
        {
            get { return companyName; }
            set { companyName = value; }
        }

        public int EmployeeCount
        {
            get { return employeeCount; }
            set { employeeCount = value; }
        }

        public Company(string companyName, int employeeCount)
        {
            // 修正构造函数赋值方向
            CompanyName = companyName;
            EmployeeCount = employeeCount;
        }

        // 实现要求的员工信息打印方法
        public void PrintAllEmployees()
        {
            Console.WriteLine($"公司名称:{CompanyName},当前登记员工数:{EmployeesList.Count}");
            Console.WriteLine("====================员工信息列表====================");
            for (int i = 0; i < EmployeesList.Count; i++)
            {
                var currentPerson = EmployeesList[i];
                // 区分正式员工和普通人员类型输出对应信息
                if (currentPerson is Employee emp)
                {
                    Console.WriteLine($"[{i+1}] 正式员工 姓名:{emp.Name},年龄:{emp.Age},入职日期:{emp.HireDate}");
                }
                else
                {
                    Console.WriteLine($"[{i+1}] 普通人员 姓名:{currentPerson.Name},年龄:{currentPerson.Age}");
                }
            }
        }
    }
}

控制台主程序代码

using Entities;

namespace Checkpoint_2___Console_App
{
    public class Program
    {
        static void Main(string[] args)
        {
            Person myPerson = new("Kari", 35);
            Employee myEmployee = new("Ole", 35, "10.10.2000");
            Company myCompany = new("Baker Hansen", 15);

            // 将员工添加到Company实例持有的员工列表中
            myCompany.EmployeesList.Add(myPerson);
            myCompany.EmployeesList.Add(myEmployee);

            // 调用打印方法输出所有员工信息
            myCompany.PrintAllEmployees();
            Console.ReadKey();
        }
    }
}
运行效果

修复后运行不会再触发栈溢出,控制台输出内容如下:

公司名称:Baker Hansen,当前登记员工数:2
员工信息列表
[1] 普通人员 姓名:Kari,年龄:35
[2] 正式员工 姓名:Ole,年龄:35,入职日期:10.10.2000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:57:20