C#构造函数疑问:为何无法用用户输入变量作为对象名称?
为什么不能用用户输入的变量名创建对象?
兄弟,我一眼就看出你这儿的问题了——你混淆了编译时的变量标识符和运行时的字符串数据这俩核心概念,咱们一步步拆解:
1. 那行代码报错的根本原因
你写的 Student (studentName) = new Student (studentName, studentID) 犯了两个关键错误:
- 语法错误:
(studentName)这种写法完全不符合C#的变量声明规则,括号在这里是多余且非法的; - 逻辑错误:
studentName是用户运行时输入的字符串变量,而C#要求变量名必须是编译时就确定的合法标识符(比如字母、下划线开头,不能是字符串值)。你没法用一个运行时的字符串来给变量命名——编译器根本不知道这个“变量名”到底是什么,也没法在后续代码里引用它。
2. 你的真实需求应该是什么?
你想要的肯定不是“给变量起和学生名一样的名字”(就算能做到,你也没法在代码里动态引用这个变量),而是把创建好的Student对象存储起来,方便后续查找/使用。刚好你已经定义了一个Dictionary<int, Student> students,这正是用来干这个的!
3. 修正后的代码示例
我帮你把addStudent方法修正并格式化了,重点是把创建的对象存入字典,而不是纠结变量名:
public class Student { public static int Count = 0; public int ID { get; set; } public string Name { get; set; } // 注意:这里建议把字典设为静态,否则每个Student实例都会有一个独立的字典 public static Dictionary<int, Student> students = new Dictionary<int, Student>(); public Student(string name, int id) { Name = name; ID = id; } public static void addStudent() { Student.Count++; Console.Write("Please enter student's name: "); string studentName = Console.ReadLine(); Console.WriteLine("Student ID value: {0}", Student.Count); int studentID = Student.Count; // 正确创建对象并存入字典 Student newStudent = new Student(studentName, studentID); students.Add(studentID, newStudent); // 如果你想通过名字查找,可以额外维护一个按名字索引的字典(注意处理重名) // public static Dictionary<string, List<Student>> studentsByName = new Dictionary<string, List<Student>>(); // if (!studentsByName.ContainsKey(studentName)) // { // studentsByName[studentName] = new List<Student>(); // } // studentsByName[studentName].Add(newStudent); } }
额外提示
- 原来的
students字典是非静态的,这意味着每个Student实例都会创建一个新字典,这显然不符合你“存储所有学生”的需求,所以我把它改成了static; - 如果需要通过学生名字查找,建议用
Dictionary<string, List<Student>>来处理重名情况,避免覆盖数据。
内容的提问来源于stack exchange,提问作者user9791487
相关产品推荐
相关产品推荐

