C#点击按钮时如何每次创建名称不同的User类新对象?
问题解答
1. ???位置的填写规则
???是你声明的User类型变量的名称,只要符合C#标识符命名规则可以随便填,比如最直接填user即可:
User user = new User(name,age,id);
但要注意:如果你只在按钮点击事件方法内部声明这个局部变量,每次点击确实会生成新的User实例,但方法执行结束后这个局部变量就会超出作用域,之前创建的实例会被垃圾回收,你无法在其他位置访问到历史创建的对象。另外C#是静态编译语言,不存在运行时动态生成不同变量名的实现方式,你不需要给每个新对象单独起不同的变量名。
2. 每次点击创建并留存不同User对象的实现方式
你需要在窗体类的层级定义一个集合容器,用来存储每次点击生成的新实例,而不是把对象只存在方法的局部变量里。参考实现代码如下:
public partial class YourWindow : Window // 你自己的窗体类 { // 类层级定义集合,存储所有创建过的User对象,不会随点击事件结束被回收 private List<User> _allUsers = new List<User>(); // 修正后的User类,补充公开属性方便外部读取字段值 public class User { private string name; private int age; private int id; public User(string name, int age, int id) { this.name = name; this.age = age; this.id = id; } // 公开只读属性,外部可以访问到对象存储的值 public int Id => id; public string Name => name; public int Age => age; } private void Button_Click(object sender, RoutedEventArgs e) { // 加输入校验,避免用户输入非数字导致转换报错 if (!int.TryParse(tb2.Text, out int age) || !int.TryParse(tb3.Text, out int id)) { MessageBox.Show("年龄和ID必须输入合法数字"); return; } string name = tb1.Text.Trim(); // 每次点击创建新的User实例 User newUser = new User(name, age, id); // 将新实例存入集合,所有历史创建的对象都会被保留 _allUsers.Add(newUser); // 如果你需要通过ID快速查找对应对象,可以把List替换为Dictionary<int, User> // 定义时写private Dictionary<int, User> _userDict = new Dictionary<int, User>(); // 存入时写_userDict.Add(id, newUser); 注意要保证ID唯一,否则会抛出重复键异常 } }
注意事项
- 不需要追求给每个对象设置不同的变量名,所有实例都存在集合中后,你可以通过索引、ID等标识快速找到对应的对象,和不同变量名的效果完全一致。
- 原代码中
User类的三个字段都是private私有修饰,外部创建对象后无法读取内部存储的name、age、id值,必须补充公开的访问属性才能正常使用对象数据。 - 直接用
Convert.ToInt32做转换存在风险,用户输入非数字内容时会直接抛出程序异常,建议改用int.TryParse做输入合法性校验。
内容的提问来源于stack exchange,提问作者xXKoksMenXx
相关产品推荐
相关产品推荐

