2016-04-27 135 views
-2

原諒一個愚蠢的問題,但我是新來的C#& OOP。如何初始化嵌套數組

任何人都可以幫助我防止「System.NullReferenceException:」?

我正在嘗試按照指示完成一項任務,並使用我們迄今爲止學到的內容(數組,類和構造函數)。

我創建了一個StudentSubjects類的數組,並將其嵌入到一個Student類的數組中。

我想打印每個學生的科目的詳細信息。

我可以訪問StudentArray[0]領域OK,但因爲「對象引用不設置到對象的實例」不能獲取到StudentArray[0].StudentSubjectsArray[0]領域

我已經待了兩個星期尋找一個答案,但無法找到如何設置

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

你的代碼看起來很奇怪。我想建議使用'List'而不是數組 - 它更靈活和安全地處理集合。 – MaKCbIMKo

+0

你好MaKCbIMKo。我不能使用列表,因爲這是一個任務,我必須做老師所說的 - 他說使用數組。 – 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

謝謝加布裏埃爾,它確實有效。它看起來像一個有用的速記。經過兩個星期,我的頭撞牆,我永遠不會拿出任何像你的建議。 – Joe

0

在我看來,一個好的做法是在構造函數初始化數組。通過這種方式,您可以確定在使用該對象時它不爲空。

所以做這樣的事情:

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

謝謝卡多加我會嘗試。 – Joe