2016-04-27 3 views
-2

Простите глупый вопрос, но я новичок в C# & OOP.Как инициализировать вложенные массивы

Может ли кто-нибудь помочь мне предотвратить «Исключение System.NullReferenceException:»?

Я пытаюсь выполнить следующее задание и используя то, что мы узнали на сегодняшний день (массивы, классы и конструкторы).

Я создал массив классов StudentSubjects и встроил его в массив классов Student.

Я хочу распечатать детали предметов каждого учащегося.

я могу получить доступ к StudentArray[0] поля ОК, но не может добраться до StudentArray[0].StudentSubjectsArray[0] полей, потому что «ссылка на объект не указывает на экземпляр объекта»

Я провел 2 недели в поисках ответа, но не может найти любые примеры того, как установить

StudentArray[0].StudentSubjectsArray[0].SubjectName = "Algebra"; 

любой совет наиболее высоко. Мой код ниже ....

using System; 

namespace Nested_Arrays 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      Student[] StudentArray = new Student[1]; 

      Console.WriteLine($"Hello"); 
      StudentArray[0] = new Student(); 
      StudentArray[0].StudentName = "Peter"; 
      StudentArray[0].StudentLocation = "Australia"; 
      Console.WriteLine($"{StudentArray[0].StudentName,10} {StudentArray[0].StudentLocation,15}"); 

      StudentArray[0].StudentSubjectsArray[0].SubjectName = "Algebra"; 
      StudentArray[0].StudentSubjectsArray[0].StudentsResult = "Pass"; 
      Console.WriteLine($"{StudentArray[0].StudentName,10} {StudentArray[0].StudentLocation,15} {StudentArray[0].StudentSubjectsArray[0].SubjectName,15} {StudentArray[0].StudentSubjectsArray[0].StudentsResult,10}"); 
      Console.WriteLine($"Goodbye"); 
     } 

     public class Student 
     { 
      public string StudentName; 
      private string studentName 
      { get { return studentName; } set { studentName = value; } } 

      public string StudentLocation; 
      private string studentLocation 
      { get { return studentLocation; } set { studentLocation = value; } } 

      public StudentSubjects[] StudentSubjectsArray; 
      private StudentSubjects[] studentSubjectsArray 
      { get { return studentSubjectsArray; } set { studentSubjectsArray = value; } } 

      //Constructor 
      public Student() { } 
     } 

     public class StudentSubjects 
     { 
      public string SubjectName; 
      private string subjectName 
      { get { return subjectName; } set { subjectName = value; } } 

      public string StudentsResult; 
      private string studentsResult 
      { get { return studentsResult; } set { studentsResult = value; } } 

      //Constructor 
      public StudentSubjects() { } 

     } 
    } 
} 
+0

Ваш код выглядит действительно странно. Я хотел бы предложить использовать «Список» вместо массивов - это более гибкий и безопасный способ работы с коллекциями. – MaKCbIMKo

+0

Здравствуйте, MaKCbIMKo. Я не могу использовать List, потому что это для задания, и я должен делать то, что говорят учителя, - он говорит, что использует массивы. – Joe

ответ

3

Вы просто необходимо добавить следующее:

StudentArray[0].StudentSubjectsArray = new StudentSubjects[1]; 
StudentArray[0].StudentSubjectsArray[0] = new StudentSubjects(); 
// and only then 
StudentArray[0].StudentSubjectsArray[0].SubjectName = "Algebra"; 
+0

Нет, OP должен сначала назначить массив 'StudentSubjectsArray'. – juharr

+0

@juharr - этот ответ делает именно это. Вы что-то упустили, или я? – AgapwIesu

+0

Я, по-видимому, пропустил основное понимание чтения. – juharr

0

Как уже говорили другие, вам нужно создать массивы, прежде чем присвоить объекты в массиве, хотя вы можете сделать как в то же самое время.

Например, если вы хотите, чтобы сделать все это в одной строке, это будет работать:

Student[] StudentArray = { 
    new Student { 
     StudentName = "Peter", 
     StudentLocation = "Australia", 
     StudentSubjectsArray = new[] { 
      new StudentSubjects { 
       SubjectName = "Algebra", 
       StudentsResult = "Pass" 
      } 
     } 
    } 
}; 
+0

Спасибо, Габриэль, это, безусловно, работает. Это похоже на полезную стенографию. Через 2 недели, ударив головой о стену, я бы никогда не придумал ничего подобного вашему предложению. – Joe

0

На мой взгляд, хорошая практика для инициализации массивов в конструкторе. Таким образом, вы уверены, что при использовании объекта он не равен нулю.

Так что-то вроде:

//Constructor 
public Student() { 
    this.studentSubjectsArray = new StudentSubjects[1]; 
} 
+0

Спасибо, кадога, я попробую. – Joe

Смежные вопросы