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

C#控制台应用:如何用Array类存储多个Member对象?求助

问题解决:数组覆盖与空引用异常

一、为什么每次调用Adduser()只会保留最后一个成员?

你当前的Adduser()方法每次都会重新创建一个全新的数组,直接替换掉原来的members数组:

members = new Member[]{ new Member(user_input) };

这就导致之前添加的所有成员都被直接丢弃了。正确的做法是维护一个索引,把新成员放到数组的下一个空位置,而不是重建整个数组。

另外要注意:你的Member构造函数存在变量名冲突问题——参数username和类的字段username同名,导致字段根本没有被正确赋值,必须加上this关键字区分:

public Member(string username) { 
    this.username = username; 
}

二、修改Collection类,支持存储最多100个成员

完全不需要在Member类里新建数组!Member是单个用户的实体,集合管理逻辑应该放在Collection类中。我们只需要添加一个计数器currentCount来跟踪已添加的成员数量,然后在Adduser()中把新成员放到数组的对应索引位置:

class Collection{
    private Member[] members = new Member[100]; // 去掉static,避免所有Collection实例共享同一数组(如果需要单例模式可以保留)
    private int currentCount = 0; // 记录已添加的成员数量

    public void Adduser(){
        if(currentCount >= 100){
            Console.WriteLine("成员数量已达上限(100个),无法添加新成员");
            return;
        }
        Console.WriteLine("username?");
        string user_input = Console.ReadLine();
        members[currentCount++] = new Member(user_input); // 放到下一个空位置,计数器自增
    }

    public Member[] GetMembers() { 
        // 推荐:返回仅包含已添加成员的数组,避免返回大量null元素
        return members.Take(currentCount).ToArray(); 
        // 如果要保留原数组结构,就用 return members;
    }
}

三、解决foreach循环的空引用异常

原数组初始化时是new Member[100],未添加成员的位置都是null,遍历整个数组时会访问到null对象的Username等属性,直接触发空引用异常。有两种简单的解决办法:

方法1:遍历仅包含已添加成员的数组(推荐)

如果使用上面修改后的GetMembers()方法(返回Take(currentCount).ToArray()),那么遍历的数组里全是非null的成员,直接遍历即可:

public void ShowMember(Collection record) {
    var data = record.GetMembers();
    foreach (var value in data) {
        Console.WriteLine(value.username);
        // 后续如果给Member类添加了Phonenum、Password等字段,确保已正确定义并赋值
        // Console.WriteLine(value.Phonenum);
        // Console.WriteLine(value.Password);
        // Console.WriteLine(value.Borrowedmovie);
    }
}

方法2:遍历原数组时判断是否为null

如果坚持返回原数组,遍历的时候要先检查value是否不为null,跳过空元素:

public void ShowMember(Collection record) {
    var data = record.GetMembers();
    foreach (var value in data) {
        if(value == null) continue; // 跳过未赋值的空元素
        Console.WriteLine(value.username);
        // Console.WriteLine(value.Phonenum);
        // Console.WriteLine(value.Password);
        // Console.WriteLine(value.Borrowedmovie);
    }
}

额外优化建议

  1. 遵循C#编码规范,把Member类的字段改为属性:
class Member{
    public string Username { get; set; }
    // 后续添加的字段也用属性形式
    // public string Phonenum { get; set; }
    // public string Password { get; set; }
    // public string Borrowedmovie { get; set; }

    public Member() { }
    public Member(string username) { 
        Username = username; 
    }
}
  1. 如果后续需要更灵活的集合操作(比如动态扩容、删除成员),可以直接用List<Member>代替数组,省去手动管理计数器和数组大小的麻烦:
private List<Member> members = new List<Member>(100); // 初始容量设为100

public void Adduser(){
    if(members.Count >= 100){
        Console.WriteLine("成员数量已达上限");
        return;
    }
    Console.WriteLine("username?");
    string user_input = Console.ReadLine();
    members.Add(new Member(user_input));
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:12:53