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
相关产品推荐
相关产品推荐

