C# 校验列表内用户实现登录时列表及对象访问异常如何解决
问题排查与修复方案
现存错误点
- 登录方法中创建了全新的空
User对象checkUser,其userName默认值为null,调用IndexOf必然报错,且完全没有使用存储所有已注册用户的userList做用户匹配 - 未提前判断用户名是否存在于用户列表中,直接通过索引访问列表大概率会触发索引越界异常
Console.WriteLine(userList)只能打印列表的类型信息,无法输出列表内的用户数据,属于调试输出错误- 登录成功时定义的
loggedInUser是方法内部局部变量,方法执行完成后就会被销毁,外部无法获取到登录用户信息
修复后代码
using System.Linq; public class User { public string userName; public string password; public string address; public int contactNumber; } public class UserController { public List<User> userList; // 改为类级别公共属性,存储当前登录用户信息,方便外部访问 public User loggedInUser; public UserController() { userList = new List<User>(); } public void RegisterUser(string username, string pass, string add, int contact) { User newUser = new User(); newUser.userName = username; newUser.password = pass; newUser.address = add; newUser.contactNumber = contact; userList.Add(newUser); Console.WriteLine($"新注册用户:{newUser.userName}"); // 遍历打印所有已注册用户名,方便调试 Console.WriteLine("当前已注册用户列表:"); foreach(var u in userList) { Console.WriteLine(u.userName); } } public void LoginUser(string username, string pass) { // 从已注册用户列表中匹配用户名一致的用户 var matchedUser = userList.FirstOrDefault(u => u.userName == username); if(matchedUser == null) { Console.WriteLine("用户名不存在"); return; } if (matchedUser.password == pass) { Console.WriteLine("登录成功"); loggedInUser = matchedUser; } else { Console.WriteLine("密码错误"); } } }
补充注意事项
- 生产环境禁止明文存储用户密码,需要做哈希加盐处理后再存入存储介质
- 可以根据业务需求给
User类的属性加上封装,避免外部直接修改内部字段
内容的提问来源于stack exchange,提问作者Cale Lewis
相关产品推荐
相关产品推荐

