【问题标题】:c#, issue with constructor using variable as name of new objectc#,构造函数使用变量作为新对象的名称的问题
【发布时间】:2018-11-04 06:06:33
【问题描述】:

我不希望所有对象都具有相同的名称。 我正在尝试使用变量(来自用户的输入)来创建对象。

为什么我不能这样做? :)

public class Student
{
   public static int Count = 0;
   public int ID   { get; set; }
   public string Name { get; set; }
   Dictionary<int, Student> students = new Dictionary<int, Student>();
   public Student (string name, int id)
   {
      Name = name;
      ID = id;
   }
   public static void addStudent()
   {
      Student.Count++;                                // incrementing value for new student id.
      Console.Write("Please enter student's name: "); // grabbing input from user.
      string studentName = Console.ReadLine();
      Console.WriteLine("Student ID value: {0}", Student.Count); // for testing.
      int studentID = Student.Count;
      /* Student (studentName) = new Student (studentName, studentID) -- The issue is with this line*/
      Student added = new Student(studentName, studentID) // using this as a temp for now.
         {
            Name = studentName,
            ID = studentID
         };
   }
}

【问题讨论】:

  • 您好,您的代码已编译。究竟是什么问题?
  • 哦等等...你将它标记为评论。
  • 您不能动态命名您的类实例,但您可以修改它们的内部值,例如名称。为什么不直接创建一个新的List&lt;Student&gt; 然后附加到它上面?
  • 我注释掉了我要使用的代码行:“Student (studentName) = new Student (studentName, studentID)”。我不能使用此代码,因为它是我假设的变量?我不希望“添加”作为创建的每个新对象的名称。有意义吗?
  • addStudentStudents 字典不应属于 student 类。

标签: c# object constructor


【解决方案1】:

一种方法可能是:

static class Program
{
    public class Student
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public Student(int ID, string Name)
        {
            this.Name = Name;
            this.ID = ID;
        }
    }

    public class Students : List<Student>
    {
        public void Add()
        {
            Console.Write("Please enter student's name: ");
            string studentName = Console.ReadLine();
            int studentID = base.Count + 1;
            Console.WriteLine("Student ID value: {0}", studentID);
            base.Add(new Student(studentID, studentName));
        }
    }

    static void Main()
    {
        Students students = new Students();
        students.Add();
    }
}

如果你想让所有学生都出现在学生班级,那么你可以将其定义为静态,但不推荐。

public class Student
{
    public int ID { get; set; }
    public string Name { get; set; }
    public Student(int ID, string Name)
    {
        this.Name = Name;
        this.ID = ID;
    }
    public static List<Student> AllStudents = new List<Program.Student>();
    public static void AddStudent()
    {
        Console.Write("Please enter student's name: ");
        string studentName = Console.ReadLine();
        int studentID = AllStudents.Count + 1;
        Console.WriteLine("Student ID value: {0}", studentID);
        AllStudents.Add(new Student(studentID, studentName));
    }
}

但作为实际问题中的 OOP 模型示例,课堂可能需要学生列表,那么您应该将所有学生分配到一个课堂。假设这样,您可以定义如下类:

class Student
{
    public int id;
    public string name;
}

class ClassRoom
{
    public int classId;
    public string className;
    public string lessonName;
    public DateTime startDate, endDate;
    .
    .
    .
    public List<Student> students = new List<Student>();
}

void Main()
{
    Student Adam = new Student(11, "Adam");
    Student Hussein = new Student(12, "Hussein");
    Student John = new Student(13, "John");

    ClassRoom Class1 = new ClassRoom{classId:1, className: "Class1", lessonName="Math"};
    Class1.students.Add(Adam);
    Class1.students.Add(Hussein);

    ClassRoom Class2 = new ClassRoom{classId:2, className: "Class2", lessonName="Physics"};
    Class1.students.Add(Adam);
    Class1.students.Add(John);
}

您可以查看天气 student.id 是否重复等等...这与 OOP 概念无关。

【讨论】:

    【解决方案2】:

    你想把所有学生都放在字典里吗?如果是这种情况,您可能希望将字典设为静态。否则,学生的每个实例都将拥有自己唯一的字典。不过我会把字典和学生分开。

    试试:

    public class Student
    {
        public static int Count = 0;
        public int ID { get; set; }
        public string Name { get; set; }
        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++;                                // incrementing value for new student id.
            Console.Write("Please enter student's name: "); // grabbing input from user.
            string studentName = Console.ReadLine();
            Console.WriteLine("Student ID value: {0}", Student.Count); // for testing.
            int studentID = Student.Count;
            /* Student (studentName) = new Student (studentName, studentID) -- The issue is with this line*/
            Student added = new Student(studentName, studentID);
            bool IDInUse = students.ContainsKey(added.ID);
            if(IDInUse)
            {
                students[added.ID] = added;
            }
            else
            {
                students.Add(added.ID, added);
            }
    
        }
    }
    

    总体上并不是最好的设置,您可能会轻易地覆盖现有学生,但它会朝着正确的方向开始。但就像我说的,我强烈建议将两者分开。如果您删除第二个学生,但添加一个新学生,它不会替换您的第二个学生,而是您的第三个。

    我建议为字典创建一个单独的类。

    public class Student
    {
        private string Name;
        public Guid ID { get; private set; }
    
        public Student(string name)
        {
            this.Name = name;
            this.ID = new Guid();
        }
    }
    
    public class StudentDirectory
    {
        public Dictionary<Guid, Student> Directory { get; private set; }
    
        public StudentDirectory() : this(new Dictionary<Guid, Student>())
        { }
    
        public StudentDirectory(Dictionary<Guid, Student> directory)
        {
            this.Directory = directory;
        }
    
        public void AddStudent(Student entry)
        {
            bool idExists = Directory.ContainsKey(entry.ID);
            if(idExists)
            {
                Directory[entry.ID] = entry;
            }
            else
            {
                Directory.Add(entry.ID, entry);
            }
        }
    
        public void AddStudent()
        {
            Console.WriteLine("Enter the new stuent's name.\n");
            string name = Console.ReadLine();
            Student entry = new Student(name);
            AddStudent(entry);
        }
    }
    

    GUID(全局唯一标识符)将有助于防止覆盖。此外,我们可以添加现有学生或使用相同的方法实例化一个。

    【讨论】:

      猜你喜欢
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      相关资源
      最近更新 更多