Заполнить массив в конструкторе - PullRequest
0 голосов
/ 22 мая 2019

У меня есть простой класс с 3 открытыми полями и 1 закрытым полем типа array.В конструкторе я хотел бы инициализировать приватное поле массива объектами самого класса

Я делаю следующее

public class Student
{
    public int StudentID { get; set; }
    public String StudentName { get; set; }
    public int Age { get; set; }
    private Student[] _studentArray;
    public Student()
    {
        _studentArray = new Student[]{
        new Student() { StudentID = 1, StudentName = "John", Age = 18 },
        new Student() { StudentID = 2, StudentName = "Steve",  Age = 21 },
        new Student() { StudentID = 3, StudentName = "Bill",  Age = 25 },
        new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 },
        new Student() { StudentID = 5, StudentName = "Ron" , Age = 31 },
        new Student() { StudentID = 6, StudentName = "Chris",  Age = 17 },
        new Student() { StudentID = 7, StudentName = "Rob",Age = 19  },
    };
}

Я строю и запускаю, я получаю следующую ошибку:

System.StackOverflowException: 'Исключение типа' System.StackOverflowException 'было сгенерировано.'

Ответы [ 4 ]

1 голос
/ 22 мая 2019

Это потому, что вы создаете бесконечные реализации этого массива, так как вы создаете массив класса, который вы инициализируете.этот конструктор никогда не сможет завершиться, так как каждая запись в вашем конструкторе порождает себя x раз.каждый из них снова х количество раз и так продолжается бесконечно

1 голос
/ 22 мая 2019

Это из-за бесконечного цикла (каждый объект Student инициализирует _studentArray других студентов и т. Д.).Вам нужно 2 класса: класс Студенты, который содержит studentArray и класс Student только со свойствами StudentID, StudentName и Age.

0 голосов
/ 22 мая 2019

Поскольку у вас бесконечная рекурсия, подобная тому, что они говорят, вы можете создать 2 класса. 1 класс для ваших студенческих свойств с ctor и 1 класс для списка студентов, который может выглядеть следующим образом:

Студенческий класс:

public class Student
{
    public int studentID { get; set; }
    public String studentName { get; set; }
    public int age { get; set; }
    public Student(int StudentID, string StudentName, int Age)
    {
         studentID = StudentID;
         studentName= StudentName;
         age = Age;
    }
}

тогда 2-й класс будет StudentList, где вы можете использовать метод Add для добавления данных ваших учеников:

public class StudentList : Collection<Student>
{
   public Student this[int ctr]
   {
      get{return this.Items[ctr]; }
      set{ this.Items[ctr] = value; }
   }

    new public Student Add(Student newStudent)
    {
        this.Items.Add(newStudent);
        return (Student)this.Items[this.Items.Count-1];
    }
}

Теперь вы можете инициализировать StudentList и использовать метод add. Надеюсь, это поможет.

0 голосов
/ 22 мая 2019

Ваш код рекурсивен и ведет к бесконечному циклу.Это происходит потому, что

new Student()

вызывает конструктор класса без параметров вашего класса Student, который затем пытается создать экземпляр нового Student, снова вызывая конструктор и так далее.Я думаю, что вы получаете, куда я иду?

...