2016-04-27 13 views
-2

愚かな質問を許しますが、私はC#& OOPを新しくしました。ネストされた配列を初期化する方法

誰も私が "System.NullReferenceException:"を防ぐことができますか?

私は指示に従って割り当てを行い、これまでに学んだこと(配列、クラス、コンストラクタ)を使用しようとしています。

私はStudentSubjectsクラスの配列を作成し、これをStudentクラスの配列に埋め込みました。

各生徒の詳細を印刷したいと思います。

私は答えを探して2週間を過ごしましたが、見つけることができません

をOK StudentArray[0]フィールドにアクセスすることができますが、「オブジェクト参照がオブジェクトのインスタンスに設定されていない」ので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

Hello 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

として、あなたは、配列内のオブジェクトを割り当てる前に、同時に両方を行うことができますが、配列を作成する必要があります。あなたは1行ですべてを行いたい場合は

たとえば、これは動作します:私の意見では

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

ガブリエルありがとう、確かに動作します。それは便利な省略表現のように見えます。 2週間後に私の頭を壁にぶつけて私はあなたの提案のようなものを思いつきませんでした。 – Joe

0

は、良い習慣は、コンストラクタで配列を初期化することです。この方法では、オブジェクトを使用するときにnullではないことがわかります。

ようなので、何かをする:あなたのコードは本当に奇妙に見える

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

ありがとうkadoga私はそれを試してみましょう。 – Joe

関連する問題