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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:54:03