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); } }
额外优化建议
- 遵循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; } }
- 如果后续需要更灵活的集合操作(比如动态扩容、删除成员),可以直接用
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
相关产品推荐
相关产品推荐

