C#中如何为每个对象创建数组并添加至列表?解决属性为空问题
问题分析与解决方案
你的代码里有两个核心问题导致姓名和地址始终为null,咱们一步步拆解:
1. 静态字段的误用
你在Person类里把_name和_address声明为static,静态字段属于类本身,而不是类的实例。这意味着所有Student对象会共享这两个值,更关键的是:你的StudentenA数组是在字段声明时直接初始化的,这时候构造函数还没执行,Person._name和_address还保持默认的null,就算后续构造函数给静态字段赋值,数组里的旧值也不会更新。
2. 数组初始化时机错误
StudentenA数组在类的字段定义阶段就完成了初始化,这个时机早于构造函数的执行,所以根本拿不到构造函数里传入的name和address值。
修改后的代码
// 把静态字段改成实例字段,每个Person实例拥有自己的姓名和地址 abstract class Person { public string _name; public string _address; } class Student : Person { #region 字段 public string _personalnumber = Fakultät.generate_personalnr(); // 先声明数组,不初始化 public string[] StudentenA; #endregion #region 构造函数 // 构造函数名必须和类名一致,原代码里的Studenten是错误的 public Student(string name, string address) { // 给当前实例的基类字段赋值,而不是静态字段 _name = name; _address = address; // 现在在构造函数里初始化数组,此时已经拿到了正确的姓名、地址和学号 StudentenA = new string[3] { _name, _address, _personalnumber }; } #endregion }
额外优化建议
- 尽量把字段设为
private或者protected,对外用属性(get; set;)来访问,符合封装原则。比如把Person类的字段改成protected string Name { get; set; },这样子类可以访问,外部不能直接修改。 - 构造函数名必须严格和类名一致,原代码里类是
Student,构造函数写Studenten会导致编译器无法识别为构造函数,这也是一个隐藏的问题。
内容的提问来源于stack exchange,提问作者Bearowl
相关产品推荐
相关产品推荐

